我的数据库中有大约 10-15 个数字,精度为 1、2 或 3 位小数,有符号和无符号。
正在使用的数据类型示例:
decimal(10,3), decimal(10,2), decimal(10,1)
Run Code Online (Sandbox Code Playgroud)
我在 PHP 中计算它们是这样的:
$result = ($value1from_col1 + ($value2from_col2 * 30)/500) * 0.453;
Run Code Online (Sandbox Code Playgroud)
然后我使用一些这样的round()功能:
$result_round = round($result, 2, PHP_ROUND_HALF_UP);
Run Code Online (Sandbox Code Playgroud)
结果$result_round最大:100.000,999
我正在检查:多少精度的 bcmath PHP 库? 并且答案指出,如果您不使用 round()、printf 等函数,这不会成为问题。
那么我应该使用 BCMath-extension 吗?(只是因为我正在使用round())
一些常见的数字不能用二进制精确表示(常见的,我的意思是它们经常出现在基于人类的系统中,显然就其本身而言这是一个无意义的概念)。例如,0.1、0.2。要了解有关二进制 fp 的一些问题,请查看此问题为什么十进制数不能以二进制精确表示?
对于许多常见的应用程序,二进制浮点数是错误的选择。例如,货币计算将是“错误的”,因为作为人类,我们希望以十进制计数,达到预定的小数位数(在货币的情况下为 2)。在金融计算中使用二进制 fp 导致的舍入错误甚至可能是盗窃的机会!
bcmath 实现十进制 FP,因此通常是更安全的选择。
对于现实世界值的测量,例如在科学实验中,二进制 FP 很好。
如果您认为要存储固定数量的小数点,那么您可能确实需要 bcmath 而不是标准二进制浮点数。如果您使用 bcmath,还要检查您的数据库表示并在那里使用十进制类型。