我应该将BCMath用于大约1,2或3位小数的值吗?

时间:2014-05-19 08:05:55

标签: php bcmath

我的数据库中有大约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()

1 个答案:

答案 0 :(得分:4)

一些常见的数字不能用二进制来表示(通常,我的意思是它们经常出现在基于人类的系统中,显然它本身就是一个无意义的概念)。例如,0.1,0.2。要理解二进制fp的一些问题,请查看此问题Why can't decimal numbers be represented exactly in binary?

对于许多常见应用程序,二进制浮点是错误的选择。例如,货币计算将是“错误的”,因为作为人类,我们希望以十进制计数到预定的小数位数(在货币的情况下为2)。在财务计算中使用二进制fp引起的舍入错误甚至可能成为盗窃的机会!

bcmath实现十进制FP,因此通常是更安全的选择。

对于现实世界值的测量,例如在科学实验中,二元FP很好。

如果您认为存储了固定数量的小数点,那么您可能确实需要bcmath而不是标准的二进制浮点数。如果您使用的是bcmath,还要检查数据库表示并使用小数类型。