1. 程式人生 > >Float浮點數與零比較的處理方法

Float浮點數與零比較的處理方法

轉載:http://blog.sina.com.cn/s/blog_5fdcf5c901013vfd.html

在使用MSSQL資料庫的時候,當某個欄位被定義成 float 浮點數型別時,我們需要特殊處理。一個float浮點數是不能直接和零比較的,int可以直接和0比較,但float浮點數是有精度要求的。

在C/C++語言中,Float為單精度,記憶體中佔4個位元組,有效數位是7位,(本來是8位的,但要除去一個正負符號位),即有效數字是7位,當超過這個精度時,浮點數就無能為力了。C++ 下的判斷方法如下:

“float型變數和“零值”比較的方法:
const float EPSINON = 0.000001;
if ((x >= - EPSINON) && (x <= EPSINON))
浮點型變數並不精確,其中EPSINON是允許的誤差(即精度),所以不可將float變數用“==”或“!=”與數字比較,應該設法轉化成“>=”或“<=”形式。如果寫成if (x == 0.0),則是錯誤的。
因為1.0在計算機中可能存為0.999999或1.00001等,很難恰好是1.0

在高階語言ASP中應用float數時,同樣需要注意這個問題。

比如,我們在資料庫欄位中定義 a, b 為 float, c 為 int ,a=2.00, b=0.01, c=200,
現在來計算 a-c*b 和 0 的大小時,我們這樣判斷:
if a-c*b <= 0 then
就是錯誤的。有人說,a-c*b 這個計算結果不正是0麼?有什麼錯?但正如我們在上面說的,2.00這個值在計算機記憶體中可能真正的值是 2.000001, b 可能是 0.0099999,所以計算機計算後的值比0大!所以上面的條件不成立!

在一般的實際應用中,我們沒有必要要求那麼高的精度,小數點後2位即可。這個時候我們可以使用asp提供的格式化函式 FormatNumber ,比如 FormatNumber(x,2,-1,-2,-2) 這個值再和 0 比較 就不會出問題了。

ASP中的語法:
FormatNumber(Expression[,NumDigAfterDec[,IncLeadingDig[,UseParForNegNum[,GroupDig]]]])

expression 必選項。要被格式化的表示式

NumDigAfterDec 可選項。指示小數點右側顯示位數的數值。預設值為 -1(指示使用的是計算機的區域設定)。

IncLeadingDig 可選項。三態常數,指示是否顯示小數值小數點前面的零
-2 = TristateUseDefault - 使用計算機區域設定中的設定。
-1 = TristateTrue - True
0 = TristateFalse - False

UseParForNegNum 可選項。三態常數,指示是否將負值置於括號中
-2 = TristateUseDefault - 使用計算機區域設定中的設定。
-1 = TristateTrue - True
0 = TristateFalse - False

GroupDig 可選項。三態常數,指示是否使用計算機區域設定中指定的數字分組符號將數字分組。
-2 = TristateUseDefault - 使用計算機區域設定中的設定。
-1 = TristateTrue - True
0 = TristateFalse - False

asp 例項

<%
a1=528.57
a2=328.57
a3=200.00

a4=(cdbl(a2)+cdbl(a3))

a1=Formatnumber(a1,2,-1)
a4=Formatnumber(a4,2,-1)


if cdbl(a1)-cdbl(a4)<>0  then
 response.write("fuck")
end if

%>
兩數相加後別忘記format,相加之前format和相加之後format是不一樣的~