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

我有一个数据库返回的3个数字,我需要一起添加。 总计1,740.01,我得到10.00。 这些是浮点数。 以下是我遇到问题的实际数字。</ p>

 &gt;  1,729.13 
&GT; 10.88
&GT; 0.00
</ code> </ pre>

如何获得这些数字的正确总数?</ p>

编辑</ strong> </ p>

  $ 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);
</ code> </ pre>
</ div>

展开原文

原文

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 );

duanquezhan7268
duanquezhan7268 旨在获得完整,自包含和最小化的示例代码。原样,样本不能简单地复制并粘贴到PHP解释器中。我们必须编写的任何其他代码可能不会导致您遇到的相同行为。另外,preg_replace可以将一个字符串数组作为第三个参数,这是它返回数组的唯一情况。
9 年多之前 回复
douwen5741
douwen5741 preg_replace返回一个数组,因此它们是数组格式。您有什么推荐的吗?
9 年多之前 回复
dongliyun3301
dongliyun3301 $cash,$card和$check值是数组还是浮点数?如果是前者,那么preg_replace不会起作用,如果是后者,那你为什么要使用array_sum?
9 年多之前 回复
duandang2838
duandang2838 感谢您的解释。这是有道理的。
9 年多之前 回复
doukong5394
doukong5394 伙计们,我已经编辑了我的帖子。谢谢您的帮助。
9 年多之前 回复
doufei9805
doufei9805 我们仍然需要Jim的一些代码来展示他是如何添加这些数字的。这不是一个简单的舍入问题,具有不准确的程度
9 年多之前 回复
doumeng3080
doumeng3080 有一些错误,因为当我将三个数字加在一起时,我得到了正确的结果。让我发布更多代码。
9 年多之前 回复
douji1999
douji1999 我查看了修订版,1740美元被取消了,2400被放回去了。看起来它来自你,因为你的名字在编辑中。无论如何,这一切都很好。:)
9 年多之前 回复
dtsps2098
dtsps2098 我必须承认,证据不利于我。
9 年多之前 回复
doufu1970
doufu1970 啊,好点@outis,我没有考虑并发编辑。这是一种可能的解释。质疑你的理智的道歉:-)
9 年多之前 回复
doupuxuan5784
doupuxuan5784 你需要显示一些实际的代码
9 年多之前 回复
douzao1119
douzao1119 我编辑的唯一内容是标签。我不知道为什么问题机构被改变了。@Jim:当你第一次提出问题时,你输入了2400.10,然后在5分钟内将其改为1740.01吗?如果是这样,那个编辑被我的标签编辑所踩踏(因此,不计算同一用户在5分钟内进行的编辑是新版本)。
9 年多之前 回复
doubinchou4219
doubinchou4219 ......漂浮物的问题!(在PHP中)
9 年多之前 回复
du4629
du4629 我把它翻了回来。为什么他回滚我纠正的数学是超出我的。
9 年多之前 回复
drv16759
drv16759 Methinks@outis需要一个数学课:-)他添加了浮点标签,并且由于一些莫名其妙的原因,将总数改为不正确的2400。
9 年多之前 回复
dongpin1059
dongpin1059 #Pekka,他们是十进制10,7
9 年多之前 回复
doubi7346
doubi7346 您需要为我们添加更多上下文和代码才能使用。
9 年多之前 回复
douluan4644
douluan4644 有关原始号码的信息,请参阅stackoverflow.com/posts/4842845/revisions。
9 年多之前 回复
dtp0760
dtp0760 不是1740.01我在帖子里有什么?
9 年多之前 回复
dqlb38410
dqlb38410 可能重复的PHPMathPrecision,PHP中的舍入,如何在PHP中解决这个问题?
9 年多之前 回复
duancheng7743
duancheng7743 如果你想知道,总数是1,740.01。如果您需要更多,看到您正在使用的代码是令人愉快的,所以我们可以帮助解决它。
9 年多之前 回复
douba2011
douba2011 它们在数据库中的数据类型是什么?
9 年多之前 回复

1个回答



不要添加使用number_format()格式化的值,否则它们可能包含千位分隔符...... '被视为字符串而不是浮点数。</ p>

假设$ cash,$ card和$ check是数组:</ p>

  $ 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);
</ code> </ pre >

在数学后进行任何格式化</ p>

编辑</ strong> </ p>

使用str_replace()而不是 preg_replace()去掉任何$,然后它是简单的加法而不是需要做array_sum(),虽然我不确定如果值是来自数据库的DECIMAL 10,7,可能来自哪里?</ p>

  $ 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);
</ code> </ pre >

(假设,在执行str_replace时,$ cash,$ card和$ check的字符串值是千位分隔符</ p>

编辑 2 </ strong> </ p>

要将$ cash数组转换为其值的总和,已清理字符串中的任何$或:</ p>

  $ cash = array(0 =&gt;'$ 1729.13',1 =&gt;'0.00',2 =&gt;'$ 1,234.56'); 

function cleanArrayValues($ value){
return(float) str_replace(array('$',','),'',$ value);
}

$ cash = array_sum(array_map('cleanArrayValues',$ cash));
</ code> < / pre>

为了演示,我在$ cash数组中添加了一个额外的值。</ p>

你需要过滤$ card和$ checks 同样的方法,使用cleanArrayValues()回调函数(如果它们都是数组)</ p>
</ div>

展开原文

原文

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)

dragon8837
dragon8837 罢工最后评论。 我现在看到了。 马克,再次感谢你的帮助。
9 年多之前 回复
dongyi8795
dongyi8795 马克,非常感谢你。 我刚刚找到你的第二个编辑。 我以前使用过array_sum,它似乎做了我需要的东西。 我可以问,你的代码做了什么,array_sum不是吗? 我只是好奇。
9 年多之前 回复
dongren1353
dongren1353 好的,它们是字符串。 这是dump:array(2){[0] => string(8)“$ 1729.13”[1] => string(4)“0.00”}
9 年多之前 回复
doumi1944
doumi1944 你的数组到底包含什么? 阵列中有多个条目吗? 如果是这样,您可能需要使用array_map()或array_walk()来取消格式化值。 使用var_dump($ cash)等来确切地检查数组中的值。
9 年多之前 回复
douyun1852
douyun1852 这是我的$ cash数组的print_r:Array([0] => $ 1729.13 [1] => 0.00)
9 年多之前 回复
duandi8544
duandi8544 是的,马克。 str_replace函数中的'subject'部分是一个数组。 从str_replace返回的是'1'而不是实际的数据库值。
9 年多之前 回复
douzhuanqian8244
douzhuanqian8244 - 如果是同样的问题,请在此处编辑您的原始帖子,否则将其作为另一个问题提出
9 年多之前 回复
douwuying4709
douwuying4709 马克,你还在吗? 我有另一个问题。
9 年多之前 回复
drn61317
drn61317 谢谢马克。 这样做了。
9 年多之前 回复
dongti8535
dongti8535 谢谢。 这些是我在我的代码中使用的其他值,因此我需要剥离美元符号。 感谢您的编辑和示例。 我现在就试一试。
9 年多之前 回复
duanlie7447
duanlie7447 谢谢..
9 年多之前 回复
douyi1966
douyi1966 只要确保它们的数字不是字符串。 A,在1,729.13中使PHP将整个数字转换为1。
9 年多之前 回复
dovs36921
dovs36921 谢谢Mark,刚刚回答了你。 变量是来自pref_replace的数组。 所以你说我需要将这些数字加在一起然后使用number_format?
9 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问