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 中的舍入不能按预期工作的主要内容,如果未能解决你的问题,请参考以下文章
C++ 中的舍入值。为啥 printf、iostream 和 round 函数 [可能] 表现不同,具体取决于 Visual Studio 和 Windows 版本?