gpt4 book ai didi

php - 浮点舍入错误 php ...我怎样才能确保它正常工作?

转载 作者:可可西里 更新时间:2023-11-01 13:28:04 25 4
gpt4 key购买 nike

我有以下功能来确定我的销售是否已全额付款。我不记得我为什么要这样做,但到目前为止它一直有效,我不记得为什么我必须这样做。

function _payments_cover_total()
{
//get_payments is a list of payment amounts such as:
//10.20, 10.21, or even 10.1010101101 (10 decimals max)

$total_payments = 0;

foreach($this->sale_lib->get_payments() as $payment)
{
$total_payments += $payment['payment_amount'];
}

//to_currency_no_money rounds total to 2 decimal places
if (to_currency_no_money($this->sale_lib->get_total()) - $total_payments ) > 1e-6 ) )
{
return false;
}

return true;
}

我想知道是否存在这样的情况:由于舍入错误,此函数在不应该返回 false 的情况下会返回 false。

我有疑问的主要部分是:

 > 1e-6

我想之前我有过,但在某些情况下它会导致问题。

> 0

最佳答案

我认为您正在执行 php floating 帮助页面上提到的操作。直接引用它:

To test floating point values for equality, an upper bound on the relative error due to rounding is used. This value is known as the machine epsilon, or unit roundoff, and is the smallest acceptable difference in calculations.

$a and $b are equal to 5 digits of precision.

<?php
$a = 1.23456789;
$b = 1.23456780;
$epsilon = 0.00001;

if(abs($a-$b) < $epsilon) {
echo "true";
}
?>

所以在你的情况下:

(to_currency_no_money($this->sale_lib->get_total()) - $total_payments) > 1e-6

由于四舍五入导致的相对误差不应大于1e-60.000001

如果您不确定左操作数是否大于右 100% 时间,那么您应该添加 abs() 例如为了正确性。

$relative_error=to_currency_no_money($this->sale_lib->get_total()) - $total_payments;
if(abs($relative_error) > 1e-6){
return false
}
return true;

关于php - 浮点舍入错误 php ...我怎样才能确保它正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23255500/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com