Php 如何舍入正确的金额?

Php 如何舍入正确的金额?,php,rounding,Php,Rounding,我对php中的round()有点问题。 我不知道,如果我真的做对了。 (这是一个订单系统) $amount可以是十进制的14,8 $price可以是十进制10,5(在数据库中) 我现在使用以下四舍五入法 美元的价格是一美元 函数取整金额($amount){ 返回(浮动)轮(金额8美元); } 函数舍入价格(金额){ 返回(浮动)轮(金额5美元); } //如果有人有更多的十进制字符,比如10.000000009 四舍五入金额(10.00000000 9)//将是10.00000001 //如果有

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

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

我现在使用以下四舍五入法 美元的价格是一美元

函数取整金额($amount){
返回(浮动)轮(金额8美元);
}
函数舍入价格(金额){
返回(浮动)轮(金额5美元);
}
//如果有人有更多的十进制字符,比如10.000000009
四舍五入金额(10.00000000 9)//将是10.00000001
//如果有人有更多的小数点,比如10.000009
四舍五入价格(10.000009)//将是10.00001
//这也是可能的
四舍五入价格(四舍五入金额(10.00000000 9)*四舍五入价格(10.000009))
用这种方法正确吗? 有些用户使用的小数超过16位。 我正在用户数据库中扣除/添加结果

但我明白了,有些用户有大约5-10美分太多了

只有8和5个小数才能解决这个问题吗? 并警告用户,如果他试图使用更多? 但是,我会对round\u cur(round\u金额(10.0000000009)*round\u cur(10.000009))产生问题

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

$amount=10.12398413498579889173459873;
$price=5.1938457198347695;
回音循环(循环金额($amount)*循环金额($price))。“
”; 回音圆整($金额*$价格); //返回 //52.58245 //52.58241

有趣

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

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

对于您的问题,一个好的通知或警告就可以了。给用户一个例子。

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


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

什么是四舍五入\ur(round\u amount(10.00000000 9)*round\u cur(10.000009))?你是指round\u price吗?我真的取决于你的用例。你的例子看起来很奇怪,因为你提到了
round\u cur
函数,但没有显示定义和
round\u amount(10.0000009)
示例应返回10.0000009,因为传递给函数的值的精度低于
舍入金额
函数指定的精度。现在是将数字相乘然后舍入,还是先舍入是严格的业务逻辑决定。我将更改
舍入价格(舍入金额(10.00000000 9)*四舍五入价格(10.000009))
到:
四舍五入价格((10.00000000 9*10.000009))
。这样,您可以使用最正确的金额进行计算,并在计算完成时对该数字进行四舍五入,而不是在计算之前(更精确)@约翰我已经更新了它。这实际上是非法的。你不能舍入金融数据。在浮点数的世界里,没有普遍的“两个精确的数字”这样的东西。而且,你已经错过了要点。