Warning!浮點數計算問題

2021-06-02 06:04:35 字數 923 閱讀 4982

在php中使用浮點數,有時會出現意想不到的結果。在程式中不注意,是很難被發現的。從而出現錯誤!

下面是php手冊關於此問題的一些解釋:      

浮點數(也叫浮點數,雙精度數或實數)可以用以下任一語法定義:

<?php

$a = 

1.234

; $b 

= 1.2e3

; $c 

= 7e-10

;?>

浮點數的形式表示:

lnum          [0-9]+

dnum          ([0-9]*[\.]) | ([\.][0-9]*)

exponent_dnum [+-]?(( | ) [ee][+-]? )

浮點數的字長和平台相關,儘管通常最大值是 1.8e308 並具有 14 位十進位制數字的精度(64 位 ieee 格式)。

warning顯然簡單的十進位制分數如同 0.1 或 0.7 不能在不丟失一點點精度的情況下轉換為內部二進位制的格式。這就會造成混亂的結果:例如,floor((0.1+0.7)*10) 通常會返回 7 而不是預期中的 8,因為該結果內部的表示其實是類似 7.9

。 這和乙個事實有關,那就是不可能精確的用有限位數表達某些十進位制分數。例如,十進位制的 1/3 變成了 0.3

。 所以永遠不要相信浮點數結果精確到了最後一位,也永遠不要比較兩個浮點數是否相等。如果確實需要更高的精度,應該使用任意精度數學函式或者 gmp 函式。

如果希望了解有關何時和如何將字串轉換成浮點數的資訊,請查閱「將字串轉換為數值」一節。對於其它型別的值,其情況類似於先將值轉換成整型,然後再轉換成浮點。請參閱「轉換為整型」一節以獲取更多資訊。自 php 5 起,如果試圖將物件轉換為浮點數,會發出一條 e_notice 錯誤。

浮點數計算

bigdecimal工具類封裝 public class bigdecimaltool 提供精確的減法運算。param v1 被減數 param v2 減數 return 兩個引數的差 public static double sub double v1,double v2 public stati...

php浮點數計算問題

如果用php的 計算浮點數的時候,可能會遇到一些計算結果錯誤的問題,比如echo intval 0.58 100 會列印57,而不是58,這個其實是計算機底層二進位制無法精確表示浮點數的乙個bug 是跨語言的,我用python也遇到這個問題。所以基本上大部分語言都提供了精準計算的類庫或函式庫,比如p...

浮點數進行計算

public static void main string args 為什麼會出現這種情況?計算機採用二進位制進行計算,有些資料可以用二進位制表示。如0.5 1 2 2 1 但是有些不行,如0.1,這就好像1 3用十進位制無法準確的表示。計算機採用機器語言來表示數值,即二進位制 名稱意義 原碼正數...