2015-09-08 89 views
0

我有一個表格顯示數據庫中數值的算術運算。 在數據庫中,所有值都是FLOAT類型。 我的算術運算是:使用php變量進行算術運算

 $difference = $row['variable1']+$row['variable2']-$row['variable3']-$row['variable4']; 
 
<td><?php echo (round($difference, 2)) ?></td>

所以。我的問題是我插入的一些值的計算。 例如:

variable1=10  
variable2=10.08 
variable3=10 
variable4=10.08 

正常它必須給差= 0;但它顯示差異= -0; 在任何情況下,如果我使用xx.07,xx.08,xx.09的值,它會給我一個結果= -0;它的值不會超過xx.07。

實施例:variable1=10; variable2=10.06; variable3=10;variable4=10.06; The result = 0;
如果我不圓的差異它給出這樣的結果:-5.68434188608E-14;

我試圖計算之前圓變量,我試圖在計算中使用"()",我試圖圓變量直接在操作中,因爲我鑫卡特之後<>(FLOAT型)需要超過2倍的值。

我試圖在數據庫中插入值時舍入值,但它給我輸入字段的錯誤插入,因爲它有4個以上的變量(在差異操作中沒有使用)。

Thx幫助我解決這個問題,我真的不明白爲什麼會發生這樣的事情。

+0

快速參考:http://docs.oracle.com/cd/ E19957-01/806-3568/ncg_goldberg.html – Yoshi

回答

1

這是「正常」的行爲。你可以閱讀有關簽署零here。 現在關於你的問題:添加0應該有所幫助。

<td><?php echo ((round($difference, 2))+0) ?></td> 
0

您需要先對每個值進行四捨五入,然後再對其進行計算。這是因爲PHP在內部存儲這些數字的方式。

0

試試這個

$difference = ($row['variable1']+$row['variable2'])-($row['variable3']+$row['variable4']);

0

問題是浮點數被存儲在數據庫中的二進制表示,因此有時不完全與小數點相同。

你可以開始考慮小數部分如何被存儲到明白這一點:

0.5 (dec) is 1/2 which in binary as 0.1 (bin) 
0.25 (dec) is 1/4 which in binary as 0.01 (bin) 
0.125 (dec) is 1/8 which in binary as 0.001 (bin) 

然而,爲了使0。08,你必須找到代表這個的1/2,1/4,1/8,1/16等的組合。不幸的是,這不能完全用二進制表示,所以它變得很接近,但並不準確。

當用這些計算完成時,因爲它們不是確切的,所以可能會保持非常小的差異。你看到的結果,「-0」(負零)表示一個非常小的負數,就像@丹尼班漢姆提到的那樣。

如果您只打算使用最多2個小數位,您可以(取決於您的數據庫)使用專爲此設計的「小數」類型。

這個在線計算器將幫助你看到這一點: http://www.binaryconvert.com/result_float.html?decimal=049048046048056

對於一些詳細信息,請參閱本SO問題: How to convert float number to Binary?