有没有办法在PHP中使用小数点后16位的最小值来执行算术运算

Is There any way to use min of 16 digit after decimal point to perform arithmetic operation in PHP

提问人:Arnab Sheikh 提问时间:11/7/2023 更新时间:11/7/2023 访问量:47

问:

我的实际值是:0.990641327804487 但是在进行PHP算术运算时,它会将这个数字转换为0.99064132780449

我试过number_format功能, 如果我将其转换为它,它会返回一个字符串。但需要它作为数字。number_format

浮点 精度 数字格式化 php-8.1

评论

3赞 Adi 11/7/2023
你可以试试。php.net/manual/en/function.bcmul.phpbcmul()
1赞 8ctopus 11/7/2023
有问题的库称为:php.net/manual/en/intro.bc.phpbcmathFor arbitrary precision mathematics PHP offers BCMath which supports numbers of any size and precision up to 2147483647 (or 0x7FFFFFFF) decimal digits, if there is sufficient memory, represented as strings.
1赞 Eric Postpischil 11/7/2023
PHP 不会将您的号码转换为 0.99064132780449。这就是它默认显示的方式。它使用的实际数字是 0.9906413278044869930027971349772997200489044189453125,这与您开始的数字 0.990641327804487 非常接近。为什么这是一个问题?

答:

1赞 IMSoP 11/7/2023 #1

PHP与任何其他现代通用编程语言一样,不使用任何数量的十进制数字来处理数学运算。相反,它使用二进制浮点表示形式,该表示形式在固定位数的位中具有可变精度。具体来说,PHP 使用“双精度”64 位 IEEE 标准浮点;这就是您正在达到极限的格式。

要使用更高的精度,您需要使用专业库来执行任意精度算术。这些运算通常比内置的浮点运算慢得多 - 浮点运算内置于现代 CPU 中,任意精度数学则不然。与 PHP 捆绑在一起的一个这样的库是 bcmath

重要的是要了解,这些库无法恢复现有浮点数中不存在的精度。通常必须以字符串形式提供输入值,以便在内部转换为某种自定义格式。