6

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

我正在检查这个:bcmath PHP 库的精度是多少? 并且答案表明,如果您不使用 round()、printf 等函数,这将不是问题。

那我应该使用 BCMath-extension 吗?(只是因为我正在使用round()

4

1 回答 1

7

一些常见的数字不能用二进制精确表示(通过常见,我的意思是它们经常出现在基于人类的系统中,显然它本身就是一个无意义的概念)。例如,0.1、0.2。要了解有关二进制 fp 的一些问题,请查看这个问题为什么不能用二进制精确表示十进制数?

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

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

对于现实世界值的测量,例如在科学实验中,二进制 FP 就可以了。

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

于 2014-05-19T08:41:58.693 回答