我在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
有趣!
round_cur
函数,但并没有显示定义,并且您的round_amount(10.0000009)
示例应返回10.0000009,因为传递给函数的值比round_amount
函数指定的精度要低。现在,将数字相乘然后对其进行舍入,还是先进行舍入再进行相乘,严格来说是业务逻辑决策。 - Mike Brantround_price(round_amount(10.000000009)*round_price(10.000009))
改为round_price((10.000000009*10.000009))
。这样你就可以在计算时使用最正确的金额,并在计算完成后对该数字进行四舍五入,而不是之前(更精确)。 - Green Black