我想我已經看了太久。爲什麼這個代碼打印'不',它應該打印'是'不應該嗎?我已經在PHP 5.3和PHP 5.2上嘗試過了,並且都打印出'不'。非常簡單的PHP添加問題
<?php
$total = 14.05;
$var1 = 0;
$var2 = 0.11;
$var3 = 13.94;
if(($var1 + $var2 + $var3) == $total)
{
echo 'yes';
}
else
{
echo 'no';
}
?>
我想我已經看了太久。爲什麼這個代碼打印'不',它應該打印'是'不應該嗎?我已經在PHP 5.3和PHP 5.2上嘗試過了,並且都打印出'不'。非常簡單的PHP添加問題
<?php
$total = 14.05;
$var1 = 0;
$var2 = 0.11;
$var3 = 13.94;
if(($var1 + $var2 + $var3) == $total)
{
echo 'yes';
}
else
{
echo 'no';
}
?>
參見Comparing floating point numbers。
這不起作用,因爲浮點數沒有完全表示。一個小的舍入誤差就足以讓相等運算符失敗。
因爲..你要平等比不上彩車......這是一個四捨五入的問題...像14.05實際上是表示爲14.0499999 ......所有你能做的事情將有一定tolarence進行比較,例如t = 0.01,那麼如果a + t> = b> = a-t,a = b將被視爲真。
像其他人一樣,不要直接比較花車。 只是做一個 如果(ABS($ float1- $ FLOAT2)< 0.0000001)
或similair
在你的情況
<?php
$total = 14.05;
$var1 = 0;
$var2 = 0.11;
$var3 = 13.94;
if (abs(($var1 + $var2 + $var3)-$total)<0.000001)
{
echo 'yes';
}
else
{
echo 'no';
}
?>
我懷疑這是由於floating point precision。
基本上浮點數不能以完全精度進行存儲,有時結果不符合您的期望。爲了比較浮點數,你應該允許一些容差。如果你確定每個數字都有兩個小數位,你可以乘以100來得到整數值,然後比較總數。
這是由浮點精度引起的。浮點數表示實際值,但僅表示一定的精度。而不是嘗試以下操作:解決此
<?
$total = 14.05;
$var1 = 0;
$var2 = 0.11;
$var3 = 13.94;
if((($var1 + $var2 + $var3) > ($total - 0.0000001)) && (($var1 + $var2 + $var3) < ($total + 0.0000001)))
{
echo 'yes';
}
else
{
echo 'no';
}
?>
一個很懶惰的方式:
$var4 = $var1 + $var2 + $var3;
$var4 = number_format($var4, 2);
$total = number_format($total, 2);
if($var4 == $total)
{
echo 'yes';
}
else
{
echo 'no';
}
這是一個基本的浮點數學問題。
電腦使用二進制數學運算。對於整數值,沒有問題。但是對於小數,它使用了一種稱爲浮點數學的技術。麻煩的是,雖然浮點數是好的,但不要直接映射到十進制值;即使相對簡單的十進制值可能也無法用二進制精確表示。
如果您總是使用兩位小數 - 例如對於貨幣 - 將整個值作爲整數處理通常是一個更好的主意(例如,存儲美分而不是美元,或便士而不是磅),以便所有你的數學是用整數完成的,結果是準確的。你只需要它作爲顯示目的的小數,你可以在你需要的時候做。
浮點值具有有限的精確度的價值。因此,值可能 任何處理後不具有相同的字符串表示形式。這也 包括寫在你的腳本中的浮點值,並直接打印它沒有任何數學運算。
如果您想了解更多關於「花車」,什麼IEEE 754,讀這樣的:
http://docs.sun.com/source/806-3568/ncg_goldberg.html
可以使用number_formattig或字符串鑄造comperation
之前,正如上文其他答案,比較浮動時要小心。試試這個:
echo ((int)(($var1+$var2+$var3)-$total)==0)?"yes":"no";
**從不**比較直接相等的浮點值。這裏有很多關於SO的問題。 – Jon 2011-04-07 14:38:00
可能是相關的:[每個計算機科學家應該知道什麼關於浮點運算](http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html) – eldarerathis 2011-04-07 14:38:23
看到這個:http: //stackoverflow.com/questions/3148937/compare-floats-in-php/3148991#3148991 – dusan 2011-04-07 14:38:38