我的数据库中有大约10-15个数字,精度为1,2或3位小数,有符号和无符号。
正在使用的数据类型示例:
decimal(10,3), decimal(10,2), decimal(10,1)
我正在用PHP计算它们:
$result = ($value1from_col1 + ($value2from_col2 * 30)/500) * 0.453;
然后我使用了一些round()
函数:
$result_round = round($result, 2, PHP_ROUND_HALF_UP);
$result_round
的结果最大:100.000,999
我正在检查这个:How much precision for a bcmath PHP library? 并且答案表明,如果你没有使用像round(),printf等函数那就不会有问题。
我应该使用BCMath扩展吗? (仅仅因为我正在使用round()
)
答案 0 :(得分:4)
一些常见的数字不能用二进制来表示(通常,我的意思是它们经常出现在基于人类的系统中,显然它本身就是一个无意义的概念)。例如,0.1,0.2。要理解二进制fp的一些问题,请查看此问题Why can't decimal numbers be represented exactly in binary?
对于许多常见应用程序,二进制浮点是错误的选择。例如,货币计算将是“错误的”,因为作为人类,我们希望以十进制计数到预定的小数位数(在货币的情况下为2)。在财务计算中使用二进制fp引起的舍入错误甚至可能成为盗窃的机会!
bcmath实现十进制FP,因此通常是更安全的选择。
对于现实世界值的测量,例如在科学实验中,二元FP很好。
如果您认为存储了固定数量的小数点,那么您可能确实需要bcmath而不是标准的二进制浮点数。如果您使用的是bcmath,还要检查数据库表示并使用小数类型。