使用SqlServer中的float類型時發現的問題


在做項目中,使用了float類型來定義一些列,如:Price,但是發現了很多問題
1、當值的位數大於6位是float型再轉varchar型的時候會變為科學技術法顯示
    此時只好將float型轉換成numeric型,再轉換成varchar
2、float型變量在存入值時,有時值得大小會發生改變。這個現象發生在對報價保存時,如:保存一個3.8,但到了數據庫中變成了3.80001124或3.79998999等
在SqlServer的幫助中是這樣描述float類型的:用於表示浮點數字數據的近似數字數據類型。浮點數據為近似值;並非數據類型范圍內的所有數據都能精確地表示。
所以今后這個類型一定要慎用


 

評論

#1樓 218.69.6.* 2007-08-05 16:09 William Wang [未注冊用戶] 

還是使用decimal(numeric)比較好
                           

請問float類型如何設置小數位數?

在客戶端(C#),如果存入一個帶小數位的小數,如:Insert   into   (fieldA)   values   (2.4);其中,fieldA是float類型.存入數據庫后,數據有可能變成2.400000或者2.4000001或者2.399999999.暈.   
    
  請問如何設置.
=========================================================================
這沒關系.顯示時轉換一下.    
     
  select   cast(fieldA   as   decimal(18,1))
=========================================================================
decimal
=========================================================================
用   decimal   類型   或   用   convert   轉換
=========================================================================
                           

SQL Server 2000中的float類型顯示四位小數  

SQL Server 2000中:

如果是數據類型Float 11.8,它就默認以11.800000000000001存儲了,顯示的時候看起來蠻不爽的,偶只想要4位小數,找了好多資料,把float型用smallmoney型感覺上就可以了。

浮點數據類型用於存儲十進制小數。浮點數值的數據SQL Server 中采用上舍入(Round up 或稱為只入不舍)方式進行存儲。所謂上舍入是指,當(且僅當)要舍入的數是一個非零數時,對其保留數字部分的最低有效位上的數值加1 ,並進行必要的進位。若一個數是上舍入數,其絕對值不會減少。如:對3.14159265358979 分別進行2 位和12位舍入,結果為3.15 和3.141592653590。

貨幣數據表示正的或負的貨幣值。在 Microsoft SQL Server 2000 中使用 money 和 smallmoney 數據類型存儲貨幣數據。貨幣數據存儲的精確度為四位小數。(正好達到我的要求:顯示四為小數就OK了)

Monetary data represents positive or negative amounts of money. In Microsoft® SQL Server™ 2000, monetary data is stored using the money and smallmoneydata types. Monetary data can be stored to an accuracy of four decimal places. Use the smallmoney data type to store values in the range from -214,748.3648 through 214,748.3647 (requires 4 bytes to store a value).

                           

SQL Server 中Float類型 如何轉換成 Varchar類型 ?

方法 如下 :

float轉化成varchar類型

select convert(varchar(8000),cast(convert(float,'12345678900') as decimal))

select str(convert(float,'123456789000'),len(convert(float,'123456789000')))

select convert(varchar(8000),cast(convert(float,'12345678900') as decimal))

STR ( float_expression [ , length [ ,    ] ] )


備注
如果為 STR 提供 length 和 decimal 參數值,則這些值應該是正數。在默認情況下或小數參數為 0 時,數字舍入為整數。指定的長度應大於或等於小數點前面的部分加上數字符號(如果有)的長度。短的 float_expression 在指定長度內右對齊,長的 float_expression 則截斷為指定的小數位數。例如,STR(12,10) 輸出的結果是 12。它在結果集內右對齊。而 STR(1223,2) 則將結果集截斷為 **。可以嵌套字符串函數。

注意: 
若要轉換為 Unicode 數據,請在 CONVERT 或 CAST 轉換函數內使用 STR。

 

參數
float_expression
帶小數點的近似數字 (float) 數據類型的表達式。

length
總長度。它包括小數點、符號、數字以及空格。默認值為 10。

decimal
小數點后的位數。decimal 必須小於或等於 16。如果 decimal 大於 16,則會截斷結果,使其保持為小數點后具有十六位。

返回類型
char


                            

 
 
SQL Server 2000 小數類型-使用 decimal、float 和 real 數據

decimal 數據類型最多可存儲 38 個數字,所有數字都能夠放到小數點的右邊。decimal 數據類型存儲了一個確定的數字表達法;沒有存儲值的近似值。

定義 decimal 的列、變量和參數的兩種特性如下:

  • p

    指定精度或對象能夠控制的數字個數。

  • s

    指定可放到小數點右邊的小數位數或數字個數。

    p 和 s 必須遵守以下規則:0 <= s <= p <= 38。

numeric 和 decimal 數據類型的默認最大精度值是 38。在 Transact-SQL 中,numeric 與 decimal 數據類型在功能上等效。

當數據值一定要按照指定精確存儲時,可以用帶有小數的 decimal 數據類型來存儲數字。

有關數學運算如何影響結果的精度和小數位數的信息,請參見精度、小數位數和長度

使用 float 和 real 數據

float 和 real 數據類型被稱為近似的數據類型。在近似數字數據類型方面,float 和 real 數據的使用遵循 IEEE 754 標准。

近似數字數據類型並不存儲為多數數字指定的精確值,它們只儲存這些值的最近似值。在很多應用程序中,指定值與存儲值之間的微小差異並不明顯。但有時這些差異也值得引起注意。由於 float 和 real 數據類型的這種近似性,當要求精確的數字狀態時,比如在財務應用程序中,在那些需要舍入的操作中,或在等值核對的操作中,就不使用這些數據類型。這時就要用 integer、decimal、money 或 smallmone 數據類型。

在 WHERE 子句搜索條件中(特別是 = 和 <> 運算符),應避免使用 float 或 real 列。最好限制使用 float 和 real 列做 > 或 < 的比較。

IEEE 754 規格提供了四種舍入模式:舍入到最接近的值、上舍入、下舍入和舍入到零。Microsoft® SQL Server™ 使用上舍入。所有的數值必須精確到確定的精度,但會產生細小的浮點值變化。因為浮點數字的二進制表示法可以采用很多合法舍入規則中的任意一條,因此我們不可能可靠地量化一個浮點值。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM