值不必要地四舍五入
Posted
技术标签:
【中文标题】值不必要地四舍五入【英文标题】:values unnecessarily rounded 【发布时间】:2012-05-23 17:50:55 【问题描述】:我有一些数据库数据,我正在用它们做一些简单的数学运算。出于某种原因,我无法将总数四舍五入到最接近的美元。不过,我还需要包含美分信息。我很肯定每个 itemPrice 条目在数据库中包含两位小数。
if (strpos($row2["itemDiscount"],'%') !== false)
$itemDiscount = $row2["itemDiscount"];
$itemDetailTotalUnformatted = $row2["itemQuantity"]*($itemPrice*(1-($itemDiscount/100)));
else
$itemDetailTotalUnformatted = $row2["itemQuantity"]*($row2["itemPrice"]-$row2["itemDiscount"]);
$itemDetailTotal = number_format($itemDetailTotalUnformatted, 2, '.', '');
echo $itemDetailTotal;
var_dump($row2):
50.00array(6)
[0]=>
string(1) "2"
"itemQuantity"]=>
string(1) "2"
[1]=>
string(5) "30.00"
[itemPrice]=>
string(1) "30.00"
[2]=>
string(4) "5.00"
[itemPrice]=>
string(4) "5.00"
【问题讨论】:
请在 $row2 上做一个 vardump。 您是否尝试过先将数据库响应字段转换为浮点数?从您的数据库返回的数据将是字符串数据。 @jon 很有趣,虽然它的数学运算是正确的,所以它肯定将所有内容都识别为数字。 那么,如果您将所有 $row[] 响应转换为浮动在 $itemDiscount 和 $itemDetailTotal 行中会发生什么变化? 你们有人读过这段代码吗? @radleybobins 你能给我们一个工作示例来说明这个代码回显0.00
aka 空字符串的问题。
【参考方案1】:
在处理货币时,始终使用整数。以美分保存价格,以美分处理价格,只有在最后除以 100 以呈现结果。
这样做的原因是 int 具有完美的精度(直到非常高的值,它们被作为浮点数处理),而浮点数则没有。 php中没有定点类型。
一旦你这样做了,你的舍入问题可能就会消失。
【讨论】:
谢谢,我现在要开始重新排列...但问题是我已经将数据库中的数字作为小数提取...我知道这看起来很愚蠢,但也许我可以绕过这是通过立即乘以 100,然后用整数处理剩下的部分。 itemPrice 和 itemDiscount 都正确显示在数据库中,只是数学运算不太正确。 在这种情况下,您也需要更新数据库以使用整数。要么,或者如果您知道它们有两个小数位(即您使用的是decimal
列),您可能只需str_replace
'ing 小数点即可逃脱。
是的,好吧,我认为我们在同一时间输入的想法相似。我无法替换数据库的原因是我正在为一个已经有前端和数据库的站点创建一个新的后端。我有一种感觉,如果我开始编辑数据库,我会在另一边搞砸。以上是关于值不必要地四舍五入的主要内容,如果未能解决你的问题,请参考以下文章
ZZNUOJ_用C语言编写程序实现1506:四舍五入(附完整源码)