货币的浮点精度:在MySQL查询,PHP和Javascript中使用“舍入”功能

use*_*371 5 php mysql floating-point precision

我正在处理美元金额。在MySQL数据库中,以下字段的费用和费率(百分比)为DECIMAL类型,两位精度。

SELECT ROUND(fee * (1- rate/100))),2 ) as profit
from products
Run Code Online (Sandbox Code Playgroud)

由于查询只是返回值而不是将它们保存在变量中,因此精度问题*是否仍然存在(PHP或JS附带)?如果是这样,最好在PHP或JS中舍入浮点数吗?

*是的,我的意思是保存双精度时出现的精度问题,例如1.5可能会另存为1.49999999

小智 1

其他人可能已经提到过这一点,但我想让您了解我用 PHP 处理金钱计算的系统。

我使用整数。问题是我让每个增量代表我需要的最高精度。对于我的大多数应用程序来说,这是百分之一美元或一美分。但是,您可以将其设置为百万分之一或任何您需要的值。

因此,在实践中,精度以百分之一为单位,$.01 表示为 1,$.10 表示为 10,$1.00 表示为 100,依此类推。这确实消除了舍入问题,因为您将仅操作整数,因为任何计算的小数部分都会被截断。不过,这没关系,因为整数代表您需要的最高精度。

诚然,这需要更多的开发来处理,但四舍五入不应该成为突然出现的问题之一。