3

我对 php 中的 round() 有一点问题。我不知道,如果我真的做对了。(是订货系统)

$amount 可以是十进制 14,8 $price 可以是十进制 10,5(在数据库中)

我现在使用以下四舍五入 $price 是一个 $amount

function round_amount($amount) {
  return (float) round($amount, 8);
}

function round_price($amount) {
  return (float) round($amount, 5);
}

//if some one have more decimal chars like 10.000000009
round_amount(10.000000009); //will be 10.00000001

//if some one have more decimal chars like 10.000009
round_price(10.000009); //will be 10.00001

//also this is possible
round_price(round_amount(10.000000009)*round_price(10.000009))

这种方式使用round正确吗?一些用户使用超过 16 位小数。我在用户数据库中扣除/添加结果。

但我看到,有些用户的 5-10 美分太多了!

解决这个问题的唯一方法是只允许 8 位和 5 位小数吗?并警告用户,如果他尝试使用更多?但是我会遇到 round_cur(round_amount(10.000000009)*round_cur(10.000009)) 的问题

我希望有人理解我的意思,或者可以告诉我,如果我的四舍五入方法是正确的。

$amount = 10.12398413498579889173459873;
$price = 5.1938457198347695;

echo round_cur(round_amount($amount)*round_cur($price))."<br />";
echo round_cur($amount*$price);

//returns
//52.58245
//52.58241

有趣的!

4

2 回答 2

1

为什么不将数据库中的实际值缓存起来,然后有一个单独的变量来显示。这样,所有计算都可以在缓存的正确值上完成,同时保持干净的 UI。只要确保每次更新缓存变量时都更新显示的变量。

此外,在进行任何舍入之前始终应用数学。将两个精确数字相乘比将两个舍入数字相乘要准确得多。这适用于数学中的每一个运算。因此,加法、减法、除法、乘法然后四舍五入,但切勿将四舍五入的数字用于另一个公式。使用以前的确切数字。

于 2013-04-13T13:12:04.240 回答
-8

我认为你的方式是正确的,但取决于你提到的情况,这两个公式返回不同的值,你是项目经理,哪个系统更适合你(你应该考虑什么最适合你和什么最适合用户并下定决心,看看您是否选择其中一个,交易将是什么),对于这种情况,我推荐第一种方法

round_price(round_amount(x)*round_price(y))

对于您的问题,一个好的通知或警告应该这样做。给用户一个例子。

于 2013-03-01T19:52:28.993 回答