我在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))
这种方式使用圆形是否正确? 有些用户使用超过16位小数。 我在用户数据库中扣除/添加结果。
但是我知道,有些用户太多了5-10美分!
解决此问题的唯一方法是,只允许8位和5位小数? 并警告用户,如果他试图使用更多? 但是我会遇到round_cur的问题(round_amount(10.000000009)* round_cur(10.000009))
我希望有人理解我的意思,或者可以告诉我,如果我的回合方式是正确的。
更新1
$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
有趣!
答案 0 :(得分:1)
为什么不保持数据库缓存的实际值,然后有一个单独的变量用于显示。这样,所有计算都可以在缓存的正确值上完成,同时保持干净的UI。只需确保每次更新缓存变量时都更新显示的变量。
此外,在进行任何舍入之前始终应用数学。乘以两个精确数字比乘以两个舍入数字要准确得多。这适用于数学中的每个操作。所以加,减,除,乘,然后舍入,但从不使用该舍入数作为另一个公式。使用上一个确切的数字。
答案 1 :(得分:-8)
我认为你的方式是正确的,但是如你提到的那样取决于你的情况,这两个公式会返回不同的值,你就是项目经理那个系统更适合你的人(你应该考虑什么是最好的)对于你和什么是最好的用户和决定你的想法,看看你是否选择,交易是什么)和这种情况,我建议第一个methid
round_price(round_amount(x)*round_price(y))
对于你的问题,一个好的通知或警告应该这样做。为用户举一个例子。