【问题标题】:Rounding and formatting money in PHP在 PHP 中舍入和格式化货币
【发布时间】:2014-10-13 05:29:57
【问题描述】:

我正在编写一个处理计算美元金额的脚本,我想知道这样做的正确方法或建议方法是什么。

我处理的是美元和美分,而不是美分。我看过such as this 的帖子,其中给出了需要小数美分的场景,例如股票。我认为我不需要那种精确度,但在我驳回它之前,我想要一些建议。

假设我以 9.99 美元的价格出售一件商品,税率为 6.5%。

$item_cost = 9.99;
$tax_percent = 0.0650; //6.5%
$tax = $item_cost * $tax_percent;
//tax is 0.38935
$total = $item_cost + $tax; 
//total is 6.37935

我不能向用户收取 6.37935 美元的费用。我只是在处理美元和美分。示例继续...

$total = 4.401433
$rounded_total = round($total,2);
echo $rounded_total;
//rounded total is 4.4

虽然我知道 4.4 美元与 4.40 美元相同,但我无法通过我的支付处理器运行它。先四舍五入到小数点后两位,然后将数字格式应用到小数点后两位“安全”吗?

$total = 4.401433
$rounded_total = round($total,2);
$formatted_total = number_format($rounded_total,2,'.','');
echo $formatted_total;
//rounded and formatted total is 4.40

通过先四舍五入到小数点后 2 位然后使用数字格式确保四舍五入的数字确实是小数点后 2 位来确定应付金额是否“可接受”?

【问题讨论】:

  • 我自己用这种方法支付运费(基于物品重量)
  • 两者都是一样的,所以你可以毫无问题地使用它......
  • 此问题属于 Stack Exchange 网络中的另一个站点:codereview.stackexchange.com

标签: php


【解决方案1】:

请勿使用 number_format 来确定小数位。 而是先圆它。 Round 是一个数学函数,与业务的运作方式密切相关。例如,如果您有一条业务规则说丢弃小数点后 2 位后的任何内容,请先将其四舍五入到小数点后 2 位。 数字格式仅用于显示目的。例如添加逗号,并在需要时添加前导 0。 当您实际保存一个数字时,请确保根据业务需要对其进行四舍五入,然后保存在数据库中(作为最终数字)

【讨论】:

  • 这正是我所做的。我在问,只要我不接受零碎的美分,这是否可以接受。我不知道是否有更简单(不是很费力)或更精确的方法来计算货币的小数点后 2 位。
  • 没错,但你也有“使用数字格式来确保四舍五入的数字确实是小数点后 2 位”,这不好。 (如果四舍五入和数字格式都是 2,那很好)。但根据经验,不要让数字格式决定小数。四舍五入的最终数字(已保存)是最终用户应该看到的。换句话说,number_format 不应该改变它的值,即使是一个分数。
  • 抱歉,只是误传。我所说的“使用数字格式确保四舍五入的数字确实是小数点后2位”的意思是四舍五入后数字为3.3,它实际上应该是3.30
  • 是的,在这种情况下,您的方法很好。通常是我的经验的方式。小数可能会变得非常复杂,特别是在涉及小计等时。只有四舍五入最终数字有助于避免最终用户重新计算时出现小数差异。在涉及金钱时,还可以添加有关如何处理小数的条款和条件。
猜你喜欢
  • 2010-11-13
  • 2016-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-22
  • 1970-01-01
相关资源
最近更新 更多