【发布时间】:2015-10-18 19:56:17
【问题描述】:
我正在处理美元金额。在 MySQL 数据库中,以下字段费用和费率(百分比)为 DECIMAL 类型,精度为 2 位小数。
SELECT ROUND(fee * (1- rate/100))),2 ) as profit
from products
由于查询只是返回值而不是将它们保存在变量中,精度问题*是否仍然存在(PHP 或 JS 附带)?如果是这样,最好在 PHP 或 JS 中对浮点数进行四舍五入?
*是的,我的意思是保存双精度时出现的精度问题,例如,1.5 可能会保存为 1.49999999
【问题讨论】:
-
精度问题还存在吗 ahm什么?
-
您的计算将返回超过两位小数的结果。你用两个。因此,将发生舍入,是的 - 问题仍然存在。在我看来(这不是事实)——最好让数据管理软件——数据库——处理数字。但这确实很难实现,因为您必须在 PHP 中执行计算,因此处理起来非常棘手。问题的核心是你使用的算法必须是一致的。您可以在 N 位小数后四舍五入、向下舍入或截断 - 您必须始终这样做。
-
简短回答:不要使用浮点值来赚钱。尽可能将货币价值存储为整数。
-
@Simba 以及更改值的存储如何准确解决舍入不一致的问题?
-
@birdspider 所以如果客户想要让我们说计算 386.74 的 3% 利息,然后将那一半四舍五入,我会怎么做?重新发明数学?如果我真的重新发明它,我将遇到与以前完全相同的问题,刚才我也有一个半生不熟、缓慢、充满错误的数学库。
标签: php mysql floating-point precision