有没有办法告诉 PHP 使用具有标准/自然语法的适当精度浮点数/小数?

Is there some way to tell PHP to use proper-precision floats/decimals WITH the standard/natural syntax?

提问人:Homer 提问时间:6/24/2022 更新时间:6/24/2022 访问量:41

问:

我发现每当涉及金钱或任何重要的事情时,都必须记住使用,然后实际使用各种功能,而不是、等,这是非常烦人和麻烦的。bc*+-*/

如果你不明白我在说什么,PHP基本上使用“不准确”的s作为其内置的、自然的语法,显然大多数其他编程语言也这样做,以达到速度的目的。PHP 通过提供您必须使用这些函数来获得准确的十进制数来“修复”此问题。float

但是嵌套函数调用太难看了:

$leftovers = bcsub($account_balance, $total_cost_for_products);

而不仅仅是一个干净的:

$leftovers = $account_balance - $total_cost_for_products;

真的没有办法做这样的事情吗?

php_ini('full_accuracy_decimals_mode', true);
$leftovers = $account_balance - $total_cost_for_products;
[...]
php_ini('full_accuracy_decimals_mode', false);

?

PHP 十进制 精度 浮点精度

评论

0赞 ADyson 6/24/2022
所以你基本上想重新编程内置运算符所做的事情,对吗?
0赞 Homer 6/24/2022
@ADyson 是的,暂时的。
3赞 ADyson 6/24/2022
好的,公平的问题,但是AFAIK这在php中是不可能的。其他语言(例如 c#)确实具有可以定义某些运算符对特定类型执行的操作的机制,但我不相信 php 会这样做。也许有人会纠正我。
3赞 Sammitch 6/24/2022
您绝对不应该使用浮点数来处理货币。使用货币基本单位的整数,例如:$1 == 100 美分。有许多图书馆使用这种方法来准确跟踪货币,并实施在 2 个人之间分配 3 笔钱并处理剩余资金的方法,而不会简单地丢失它。例如:github.com/moneyphp/money
1赞 Sammitch 6/24/2022
此外,出于论证的目的,浮点数与您写出的小数一样“准确”。小数只能准确表示以 10 为基数的复合分数,而浮点数只能准确表示以 2 为基数的复合分数。尝试在两者中表示 1/3 之类的东西,并且您引入了不准确。任何基数中的分数值只有在您将它们转换为带有隐含小数的整数并对边缘情况使用特殊逻辑时才会变得“准确”,例如:货币库。

答: 暂无答案