mysql 中的舍入不能按预期工作

Posted

技术标签:

【中文标题】mysql 中的舍入不能按预期工作【英文标题】:Rounding in mysql doesn't work as expected 【发布时间】:2017-02-20 02:55:58 【问题描述】:

我不明白为什么我的结果不同:

我有 orders 表和 price 列(在 mysql 中键入 double)。

数据库中的价格值为13.5

查询:

SELECT ROUND(price * 0.09, 2) FROM orders where id = 1;

结果是:1.21

查询:

SELECT ROUND(13.5 * 0.09, 2);

结果是 1.22

不四舍五入:SELECT 13.5 * 0.09 结果为 1.215

所以回合后的正确结果是1.22

为什么查询 SELECT ROUND(price * 0.09, 2) FROM orders where id = 1; 给我错误的结果 (1.21)?

我不明白出了什么问题,我猜是演员表的问题。

谁能解释一下?

【问题讨论】:

这可能对你有帮助***.com/questions/10446581/mysql-round-weird-bug 这个 url 对 MySQL ROUND 函数有帮助 (w3resource.com/mysql/mathematical-functions/…) 您不太可能希望 DOUBLE 获得“价格”。见十进制。 【参考方案1】:

我不能评论,所以我给你写一个答案。

阅读:http://dev.mysql.com/doc/refman/5.7/en/problems-with-float.html

Float 和 Double 数据,不要存储确切的数字,所以可能会发现奇怪的问题。

按照 AT-2016 告诉你的那样尝试 CEIL,希望你找到解决方案。

【讨论】:

【参考方案2】:

如果数据类型是浮点数,则使用强制转换 SELECT round(cast(qty as decimal(10,2))*0.99,2) FROM orders WHERE 1

【讨论】:

【参考方案3】:

最后我将列转换为十进制 15,2。我有点害怕转换的风险,经过几次测试,总价格没有差异。我建议所有遇到此问题的人都这样做。

Best data type to store money values in MySQL

【讨论】:

以上是关于mysql 中的舍入不能按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

openjdk8中的舍入问题

java中的舍入双[重复]

如何处理 Shapely 中的舍入误差

有没有办法防止opencv矩阵除法中的舍入

C++ 中的舍入值。为啥 printf、iostream 和 round 函数 [可能] 表现不同,具体取决于 Visual Studio 和 Windows 版本?

在 C++ 中使用 floor 函数的舍入错误