01总值的差值

时间:2013-01-14 20:31:14

标签: php floating-point

我有一个小问题,以获得正确的发票总额。

我有sql表

unit_price decimal(25,2)
vat varchar(55)
total_novat decimal(25,2)
total_vat decimal(25,2)
grand_total decimal(25,2)

获取值的php脚本是:

$discount = 2
$total_novat += qty * unit_price / discount
$total_vat = qty * vat / 100
$grand_total = total_novat + total_vat

好,现在如果我制作这个简单的脚本,结果就是:

unit_price: 1 * 241.14 / 2 = 120.57
total_novat: 120.57 * 24 / 100 = 28.94
grand_total: 120.57 + 28.94 = 149.51

问题是,当我把这段代码放在php中时,结果是149.50而不是149.51

感谢任何帮助。

执行计算的完整脚本:

<?php
$inv_total_no_tax = 0;

                for($i=1; $i<=TOTAL_ROWS; $i++){
                    if( $this->input->post($quantity.$i) && $this->input->post($product.$i) && $this->input->post($unit_price.$i) && $this->input->post($discount.$i) ) {

                        $tax_id = $this->input->post($tax_rate.$i);
                        $tax_details = $this->sales_model->getTaxRateByID($tax_id);
                        $taxRate = $tax_details->rate;
                        $taxType = $tax_details->type;  
                        $tax_rate_id[] = $tax_id;               

                        $inv_quantity[] = $this->input->post($quantity.$i);
                        $inv_product_code[] = $this->input->post($product.$i);
                        $inv_unit_price[] = $this->input->post($unit_price.$i) / $this->input->post($discount.$i);
                        $inv_unit_discount[] = $this->input->post($discount.$i);
                        $inv_gross_total[] = (($this->input->post($quantity.$i)) * ($this->input->post($unit_price.$i)) / ($this->input->post($discount.$i)));

                        if($taxType = 1) {
                        $val_tax[] = (($this->input->post($quantity.$i)) * ($this->input->post($unit_price.$i)) / ($this->input->post($discount.$i)) * $taxRate / 100);
                        } else {
                        $val_tax[] = $taxRate;
                        }

                        if($taxType = 1) { $tax[] = $taxRate."%"; } else { $tax[] = $taxRate;  }

                        $inv_total_no_tax += (($this->input->post($quantity.$i)) * ($this->input->post($unit_price.$i)) / ($this->input->post($discount.$i)));

                    }
                }

                 $total_tax = array_sum($val_tax);
                 $total = $inv_total_no_tax + $total_tax;

php脚本中的圆形选项我将十进制mysql更改为varchar。

if i use $total = round($inv_total_no_tax + $total_tax, 2); the result is: 149.5
if i use $total = round($inv_total_no_tax + $total_tax, 3); the result is: 149.501

解决方案:

在将它介绍给mysql之前,我已经应用了这个字符串。

number_format($value, 2, null, '');

2 个答案:

答案 0 :(得分:2)

问题在于您在示例计算中做出的假设

unit_price: 1 * 241.14 / 2 = 120.57
total_novat: 120.57 * 24 / 100 = 28.94
grand_total: 120.57 + 28.94 = 149.51

如果没有舍入处理它会看起来像这样(这是你的PHP代码中发生的事情):

unit_price: 1 * 241.14 / 2 = 120.57
total_novat: 120.57 * 24 / 100 = 28.9368
grand_total: 120.57 + 28.9368 = 149.5068

如果将此值149.5068插入mysql,它将被存储为149.50(如果存储在十进制列中,mysql将截断,而不是舍入,附加数字)。相反,您需要对最终计算进行舍入,以使最终值为149.51

答案 1 :(得分:0)

而不是十进制(25,2)尝试小数(25,3),然后在完成所有计算后舍入您的数字。这将使您的小数更准确。通常最好尽可能精确地存储数字,然后在完成所有计算后对其进行格式化。