doufu5747 2011-01-30 12:19
浏览 60
已采纳

添加数字不会产生预期的结果

I have 3 numbers returned from a database that I need to add together. For a total of 1,740.01, I get like 10.00. These are floating point numbers. Here are the actual numbers I'm having a problem with.

> 1,729.13
> 10.88
> 0.00

How do I get the correct total of these numbers?

EDIT

$cash = preg_replace('/\$/', '', $cash);
$card = preg_replace('/\$/', '', $card);
$check = preg_replace('/\$/', '', $check);

$cash = number_format(array_sum($cash), 2);
$card = number_format(array_sum($card), 2);
$check = number_format(array_sum($check), 2);
$total  = number_format( $cash + $card + $check, 2 );
  • 写回答

1条回答

  • doufei16736 2011-01-30 12:44
    关注

    Don't add values that have been formatted using number_format(), otherwise they may well contain , as a thousand's separator... they're treated as strings rather than floats.

    Assuming that $cash, $card and $check are arrays:

    $cash = array_sum($cash);
    $card = array_sum($card);
    $check = array_sum($check);
    
    $total  = number_format( $cash + $card + $check, 2 ); 
    
    $cash = number_format( $cash, 2 );
    $card = number_format( $card, 2 );
    $check = number_format( $check, 2 );
    

    Do any formatting after the math

    EDIT

    Use str_replace() rather than preg_replace() to strip out any $, then it's simple addition rather than needing to do the array_sum(), though I'm not sure where any $ is likely to come from if the values are DECIMAL 10,7 from the database

    $cash = (float) str_replace( array('$',','), '', $cash );
    $card = (float) str_replace( array('$',','), '', $card );
    $check = (float) str_replace( array('$',','), '', $check );
    
    $total  = number_format( $cash + $card + $check, 2 ); 
    
    $cash = number_format( $cash, 2 );
    $card = number_format( $card, 2 );
    $check = number_format( $check, 2 );
    

    (assumes that , is your thousands separator in the string values for $cash, $card and $check when doing the str_replace()

    EDIT 2

    To convert the $cash array to a sum of its values, having cleaned up any $ or , in the strings:

    $cash = array ( 0 => '$1729.13', 1 => '0.00', 2 => '$1,234.56' );
    
    function cleanArrayValues($value) {
        return (float) str_replace( array('$',','), '', $value );
    }
    
    $cash = array_sum(array_map('cleanArrayValues',$cash));
    

    I've added an extra value into the $cash array just to demonstrate.

    You'll need to filter $card and $checks in the same way, using the cleanArrayValues() callback function (if they're all arrays)

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 MATLAB怎么通过柱坐标变换画开口是圆形的旋转抛物面?
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿