如何解决float类型的2.3 插入到数据库时就成2.29999999999999这个问题?

时间:2022-02-01 23:51:02
如题 当然不能修改数据库字段的类型 类型是float  类型

120 个解决方案

#1


#2


 float是单精度数啊 2.3是对的啊 

#3


你可以在用户输入后 然后在四舍五入一下 取小数点后一位小数

我现在从不用float类型 恶心死了 只用varchar和int

#4


引用 3 楼 dengyi425 的回复:
你可以在用户输入后 然后在四舍五入一下 取小数点后一位小数

我现在从不用float类型 恶心死了 只用varchar和int


int和varchar解决不了所有问题

#5


decimal

#6


用decimal吧

#7


当时现在改不了类型 根本就不能改

#8


LZ可以看下,数据变化的时机:
1. 在SQL语句里,值已经发生变化,这种问题可以通过程序控制
2. SQL语句执行后,值发生变化,这个部分属于系统问题了

#9


你把整条记录取出来,然后单独修改浮点数的值,最后再把它更新到数据库中就行了

#10


    float本就是近似值,它不是精確值。
    通俗點講float是有兩個值的,一個是Text,就是你在DB中看到的數字,如2.3,另一個則是Value,就是它真實的值,也就是2.299999999999.
    所以在做四舍五入、精確的Report、比較(只能用<、>而不能用=)時請盡量避免使用float類型。建議使用Decimal類型或者Numeric類型。
    如果LZ不想改變類型可以嘗試這樣,select convert(num as decimal(10,3)) from tb

#11


應用線上叢書的一段話。

/*
使用 float 與 real 資料
float 和 real 資料類型也稱為近似資料類型。float 和 real 的行為遵循 IEEE 754 有關近似數值資料類型的規格。

近似數值資料類型不會儲存對許多數字指定的精確數值,而會儲存十分接近的近似值。針對許多應用程式來說,指定數值和所儲存近似值之間的些微差異並不值得注意。不過有時候這些差異卻又十分重要。由於 float 和 real 資料類型的近似本質,在需要精確數值行為時請勿使用這些資料類型,例如財務應用程式、牽涉到四捨五入的作業或者進行相等檢查作業時。反之,請使用 integer、decimal、money 或 smallmoney 資料類型。

避免在 WHERE 子句的搜尋條件中使用 float 或 real 資料行,尤其是 = 與 <> 運算子。最好將 float 和 real 資料行限制為 > 或 < 比較。

IEEE 754 規格提供四種四捨五入模式:四捨五入進位、無條件進位、無條件捨去進位與四捨五入到零。Microsoft SQL Server 2005 則使用無條件進位。所有運算都準確到保證的精確度,但可能產生稍微不同的浮點值。因為浮點數的二進位表示法可以使用任一種有效的四捨五入方式,所以不可能有效地限定浮點值。
*/

最后再強調一下,float是近似值,不是準確值,你看到的2.3就是2.2999999999的近似值。

#12


我也间碰到同样的问题,关注

#13


decimal

#14


引用 8 楼 conanhhy 的回复:
LZ可以看下,数据变化的时机:
1. 在SQL语句里,值已经发生变化,这种问题可以通过程序控制
2. SQL语句执行后,值发生变化,这个部分属于系统问题了

我觉得你分析的很好 我这里属于第二种情况 意思就是说根本就不能解决麽?

#15


引用 10 楼 takako_mu 的回复:
    float本就是近似值,它不是精確值。
    通俗點講float是有兩個值的,一個是Text,就是你在DB中看到的數字,如2.3,另一個則是Value,就是它真實的值,也就是2.299999999999.
    所以在做四舍五入、精確的Report、比較(只能用 <、>而不能用=)時請盡量避免使用float類型。建議使用Decimal類型或者Numeric類型。
    如果LZ不想改變類型可以嘗試這樣,select convert(num as decimal(10,3)) from tb


我以前也尝试你的看法 你的知道显示的时候看到的是2.3 但是我现在解决的是 插入的时候就要显示成2.3 
 

#16


Decimal类型可以直接设置小数点后的小数位......

#17


引用 15 楼 wanglltulong 的回复:
引用 10 楼 takako_mu 的回复:
    float本就是近似值,它不是精確值。
    通俗點講float是有兩個值的,一個是Text,就是你在DB中看到的數字,如2.3,另一個則是Value,就是它真實的值,也就是2.299999999999.
    所以在做四舍五入、精確的Report、比較(只能用 <、>而不能用=)時請盡量避免使用float類型。建議使用Decimal類型或者Numeric類型。
    如果LZ不想改變類型可以嘗試這樣,select convert(num as decimal(10,3)) from tb


我以前也尝试你的看法 你的知道显示的时候看到的是2.3 但是我现在解决的是 插入的时候就要显示成2.3


select convert(YourColumnName as decimal(10,1)) from YourtbName

#18


lz如果插入后显示的是2.3,插入前是2.3吗?

#19


引用 17 楼 takako_mu 的回复:
引用 15 楼 wanglltulong 的回复:
引用 10 楼 takako_mu 的回复:
    float本就是近似值,它不是精確值。
    通俗點講float是有兩個值的,一個是Text,就是你在DB中看到的數字,如2.3,另一個則是Value,就是它真實的值,也就是2.299999999999.
    所以在做四舍五入、精確的Report、比較(只能用 <、>而不能用=)時請盡量避免使用float類型。建議使用Decimal類型或者Numeric類型。
    如果LZ不想改變類型可以嘗試這樣,select convert(num as decimal(10,3)) from tb


我以前也尝试你的看法 你的知道显示的时候看到的是2.3 但是我现在解决的是 插入的时候就要显示成2.3


SQL codeselectconvert(YourColumnNameasdecimal(10,1))from YourtbName


從一個Table讀取然后Inert進另一個Table

insert into tableB
select convert(YourColumnName as decimal(10,1))from YourtbName

#20


引用 10 楼 takako_mu 的回复:
    float本就是近似值,它不是精確值。
    通俗點講float是有兩個值的,一個是Text,就是你在DB中看到的數字,如2.3,另一個則是Value,就是它真實的值,也就是2.299999999999.
    所以在做四舍五入、精確的Report、比較(只能用 <、>而不能用=)時請盡量避免使用float類型。建議使用Decimal類型或者Numeric類型。
    如果LZ不想改變類型可以嘗試這樣,select convert(num as decimal(10,3)) from tb



顶一下

我从来不用 float和double 来存储数据


我们平时说的整数,它是离散的值,数量可以确定。比如说1~ 100之间,一共有100个整数,因此用一个字节就可以精确表示

而小数是连续的值,从纯数学角度看,仅仅是1~2之间就有无穷多个小数。因此,无论计算机内有多大的内存,都是不可能精确表示一个小数的。所以,计算机表示的小数都是近似值。

#21


带小数点的我全用DOUBLE

#22


引用 18 楼 zhoulingchuan 的回复:
lz如果插入后显示的是2.3,插入前是2.3吗?


是的 我是用存储过程做的插入 插入的参数是2.3 但是插入到数据库后 就变成了保留了16位小数 

关键看数据库里面的那个值

#23


引用 19 楼 takako_mu 的回复:
引用 17 楼 takako_mu 的回复:
引用 15 楼 wanglltulong 的回复:
引用 10 楼 takako_mu 的回复:
    float本就是近似值,它不是精確值。
    通俗點講float是有兩個值的,一個是Text,就是你在DB中看到的數字,如2.3,另一個則是Value,就是它真實的值,也就是2.299999999999.
    所以在做四舍五入、精確的Report、比較(只能用 <、>而不能用=)時請盡量避免使用float類型。建議使用Decimal類型或者Numeric類型。
    如果LZ不想改變類型可以嘗試這樣,select convert(num as decimal(10,3)) from tb


我以前也尝试你的看法 你的知道显示的时候看到的是2.3 但是我现在解决的是 插入的时候就要显示成2.3


SQL codeselectconvert(YourColumnNameasdecimal(10,1))from YourtbName


從一個Table讀取然后Inert進另一個Table
SQL codeinsertinto tableBselectconvert(YourColumnNameasdecimal(10,1))from YourtbName



 你的意思是我这边还需要建一张表麽? 

#24


Decimal

#25


引用 23 楼 wanglltulong 的回复:
引用 19 楼 takako_mu 的回复:
引用 17 楼 takako_mu 的回复:
引用 15 楼 wanglltulong 的回复:
引用 10 楼 takako_mu 的回复:
    float本就是近似值,它不是精確值。
    通俗點講float是有兩個值的,一個是Text,就是你在DB中看到的數字,如2.3,另一個則是Value,就是它真實的值,也就是2.299999999999.
    所以在做四舍五入、精確的Report、比較(只能用 <、>而不能用=)時請盡量避免使用float類型。建議使用Decimal類型或者Numeric類型。
    如果LZ不想改變類型可以嘗試這樣,select convert(num as decimal(10,3)) from tb


我以前也尝试你的看法 你的知道显示的时候看到的是2.3 但是我现在解决的是 插入的时候就要显示成2.3


SQL codeselectconvert(YourColumnNameasdecimal(10,1))from YourtbName


從一個Table讀取然后Inert進另一個Table
SQL codeinsertinto tableBselectconvert(YourColumnNameasdecimal(10,1))from YourtbName



你的意思是我这边还需要建一张表麽?

你的數據從哪來?你要導到哪里?你是如何導數據的?

#26


用于表示浮点数字数据的近似数字数据类型。浮点数据为近似值;并非数据类型范围内的所有数据都能精确地表示。
语法
float [ ( n ) ]
从 - 1.79E + 308 到 1.79E + 308 之间的浮点数字数据。n 为用于存储科学记数法 float 数尾数的位数,同时指示其精度和存储大小。n 必须为从 1 到 53 之间的值。

#27


我的数据是从程序中手动输入的 

通过model 存入到库中 如果是这样的话 那么修改的时候如何操作? 修改floate 这个类型的字段的值,那麽 那个值该如何处理呢?

#28


引用 27 楼 wanglltulong 的回复:
我的数据是从程序中手动输入的

通过model 存入到库中 如果是这样的话 那么修改的时候如何操作? 修改floate 这个类型的字段的值,那麽 那个值该如何处理呢?

要么在程式中將值定下來,要么修改float的類型,怎么改自己上網查。

#29


检查是否在数据库字段上是否定义了多精度的值,或者在Dataset上定义的字段类型,float本来就是单精度 应该不会出错的 

#30


  恩 好像是没有别的办法 了 我觉得我已经做到死胡同了 

#31


宁外 感谢推荐这个帖子的人 没想到会被推荐 很开心 呵呵 

#32


该回复于2009-09-29 15:49:28被版主删除

#33


建议使用decimal

#34


我就是用decimal解决的。还是别用float了吧。

#35


.

#36


如何解决float类型的2.3 插入到数据库时就成2.29999999999999这个问题?

#37


还是用decimal实在一点

#38


学习重要

#39


lg

#40


学习了

#41



Numeric(24,6)--我们用的

#42


这也推荐?这只能说明现在学.NET开发的基础都不过关,连IEEE 754浮点数是怎么回事都不知道...甚至连存储和显示的原理都不知道...

1.你要用浮点数就必须容忍它们的误差...
2.你要显示什么格式什么精度的数字和存储无关...

看不懂这两点说明你需要先去找本最基础的计算机原理书认真看...

#43


天啦,这也叫问题,你不会四舍五入显示吗?

#44


学些了,谢谢

#45


学些了,谢谢

#46


没积分用了。。。可怜啊。。。。。。。。。。。

#47


不知道你的数据库是什么数据库啊,如果是MS SQL,建议不要用float类型

#48


引用 43 楼 ahjoe 的回复:
天啦,这也叫问题,你不会四舍五入显示吗?


如果是为了显示我也不会费这个功夫提问了 关键是存入到数据库的时候一起开发的人员不希望看到这样的数字
他们说很乱..

#49


引用 42 楼 vrhero 的回复:
这也推荐?这只能说明现在学.NET开发的基础都不过关,连IEEE 754浮点数是怎么回事都不知道...甚至连存储和显示的原理都不知道...

1.你要用浮点数就必须容忍它们的误差...
2.你要显示什么格式什么精度的数字和存储无关...

看不懂这两点说明你需要先去找本最基础的计算机原理书认真看...


我的sql   是不太好 但是这个问题的根源是 float 在什么情况下会是这样的 如果是float 如果不给这样写float[(n)] 它应该是输入是什么 存储什么  但是我的为什么会这样  我们应该不能让设计数据库的人从新设计吧 只有想办法 

#50


数据类型是能改掉的!你所谓的不能改是因为你表里有数据,把数据清空了就可以改了

#1


#2


 float是单精度数啊 2.3是对的啊 

#3


你可以在用户输入后 然后在四舍五入一下 取小数点后一位小数

我现在从不用float类型 恶心死了 只用varchar和int

#4


引用 3 楼 dengyi425 的回复:
你可以在用户输入后 然后在四舍五入一下 取小数点后一位小数

我现在从不用float类型 恶心死了 只用varchar和int


int和varchar解决不了所有问题

#5


decimal

#6


用decimal吧

#7


当时现在改不了类型 根本就不能改

#8


LZ可以看下,数据变化的时机:
1. 在SQL语句里,值已经发生变化,这种问题可以通过程序控制
2. SQL语句执行后,值发生变化,这个部分属于系统问题了

#9


你把整条记录取出来,然后单独修改浮点数的值,最后再把它更新到数据库中就行了

#10


    float本就是近似值,它不是精確值。
    通俗點講float是有兩個值的,一個是Text,就是你在DB中看到的數字,如2.3,另一個則是Value,就是它真實的值,也就是2.299999999999.
    所以在做四舍五入、精確的Report、比較(只能用<、>而不能用=)時請盡量避免使用float類型。建議使用Decimal類型或者Numeric類型。
    如果LZ不想改變類型可以嘗試這樣,select convert(num as decimal(10,3)) from tb

#11


應用線上叢書的一段話。

/*
使用 float 與 real 資料
float 和 real 資料類型也稱為近似資料類型。float 和 real 的行為遵循 IEEE 754 有關近似數值資料類型的規格。

近似數值資料類型不會儲存對許多數字指定的精確數值,而會儲存十分接近的近似值。針對許多應用程式來說,指定數值和所儲存近似值之間的些微差異並不值得注意。不過有時候這些差異卻又十分重要。由於 float 和 real 資料類型的近似本質,在需要精確數值行為時請勿使用這些資料類型,例如財務應用程式、牽涉到四捨五入的作業或者進行相等檢查作業時。反之,請使用 integer、decimal、money 或 smallmoney 資料類型。

避免在 WHERE 子句的搜尋條件中使用 float 或 real 資料行,尤其是 = 與 <> 運算子。最好將 float 和 real 資料行限制為 > 或 < 比較。

IEEE 754 規格提供四種四捨五入模式:四捨五入進位、無條件進位、無條件捨去進位與四捨五入到零。Microsoft SQL Server 2005 則使用無條件進位。所有運算都準確到保證的精確度,但可能產生稍微不同的浮點值。因為浮點數的二進位表示法可以使用任一種有效的四捨五入方式,所以不可能有效地限定浮點值。
*/

最后再強調一下,float是近似值,不是準確值,你看到的2.3就是2.2999999999的近似值。

#12


我也间碰到同样的问题,关注

#13


decimal

#14


引用 8 楼 conanhhy 的回复:
LZ可以看下,数据变化的时机:
1. 在SQL语句里,值已经发生变化,这种问题可以通过程序控制
2. SQL语句执行后,值发生变化,这个部分属于系统问题了

我觉得你分析的很好 我这里属于第二种情况 意思就是说根本就不能解决麽?

#15


引用 10 楼 takako_mu 的回复:
    float本就是近似值,它不是精確值。
    通俗點講float是有兩個值的,一個是Text,就是你在DB中看到的數字,如2.3,另一個則是Value,就是它真實的值,也就是2.299999999999.
    所以在做四舍五入、精確的Report、比較(只能用 <、>而不能用=)時請盡量避免使用float類型。建議使用Decimal類型或者Numeric類型。
    如果LZ不想改變類型可以嘗試這樣,select convert(num as decimal(10,3)) from tb


我以前也尝试你的看法 你的知道显示的时候看到的是2.3 但是我现在解决的是 插入的时候就要显示成2.3 
 

#16


Decimal类型可以直接设置小数点后的小数位......

#17


引用 15 楼 wanglltulong 的回复:
引用 10 楼 takako_mu 的回复:
    float本就是近似值,它不是精確值。
    通俗點講float是有兩個值的,一個是Text,就是你在DB中看到的數字,如2.3,另一個則是Value,就是它真實的值,也就是2.299999999999.
    所以在做四舍五入、精確的Report、比較(只能用 <、>而不能用=)時請盡量避免使用float類型。建議使用Decimal類型或者Numeric類型。
    如果LZ不想改變類型可以嘗試這樣,select convert(num as decimal(10,3)) from tb


我以前也尝试你的看法 你的知道显示的时候看到的是2.3 但是我现在解决的是 插入的时候就要显示成2.3


select convert(YourColumnName as decimal(10,1)) from YourtbName

#18


lz如果插入后显示的是2.3,插入前是2.3吗?

#19


引用 17 楼 takako_mu 的回复:
引用 15 楼 wanglltulong 的回复:
引用 10 楼 takako_mu 的回复:
    float本就是近似值,它不是精確值。
    通俗點講float是有兩個值的,一個是Text,就是你在DB中看到的數字,如2.3,另一個則是Value,就是它真實的值,也就是2.299999999999.
    所以在做四舍五入、精確的Report、比較(只能用 <、>而不能用=)時請盡量避免使用float類型。建議使用Decimal類型或者Numeric類型。
    如果LZ不想改變類型可以嘗試這樣,select convert(num as decimal(10,3)) from tb


我以前也尝试你的看法 你的知道显示的时候看到的是2.3 但是我现在解决的是 插入的时候就要显示成2.3


SQL codeselectconvert(YourColumnNameasdecimal(10,1))from YourtbName


從一個Table讀取然后Inert進另一個Table

insert into tableB
select convert(YourColumnName as decimal(10,1))from YourtbName

#20


引用 10 楼 takako_mu 的回复:
    float本就是近似值,它不是精確值。
    通俗點講float是有兩個值的,一個是Text,就是你在DB中看到的數字,如2.3,另一個則是Value,就是它真實的值,也就是2.299999999999.
    所以在做四舍五入、精確的Report、比較(只能用 <、>而不能用=)時請盡量避免使用float類型。建議使用Decimal類型或者Numeric類型。
    如果LZ不想改變類型可以嘗試這樣,select convert(num as decimal(10,3)) from tb



顶一下

我从来不用 float和double 来存储数据


我们平时说的整数,它是离散的值,数量可以确定。比如说1~ 100之间,一共有100个整数,因此用一个字节就可以精确表示

而小数是连续的值,从纯数学角度看,仅仅是1~2之间就有无穷多个小数。因此,无论计算机内有多大的内存,都是不可能精确表示一个小数的。所以,计算机表示的小数都是近似值。

#21


带小数点的我全用DOUBLE

#22


引用 18 楼 zhoulingchuan 的回复:
lz如果插入后显示的是2.3,插入前是2.3吗?


是的 我是用存储过程做的插入 插入的参数是2.3 但是插入到数据库后 就变成了保留了16位小数 

关键看数据库里面的那个值

#23


引用 19 楼 takako_mu 的回复:
引用 17 楼 takako_mu 的回复:
引用 15 楼 wanglltulong 的回复:
引用 10 楼 takako_mu 的回复:
    float本就是近似值,它不是精確值。
    通俗點講float是有兩個值的,一個是Text,就是你在DB中看到的數字,如2.3,另一個則是Value,就是它真實的值,也就是2.299999999999.
    所以在做四舍五入、精確的Report、比較(只能用 <、>而不能用=)時請盡量避免使用float類型。建議使用Decimal類型或者Numeric類型。
    如果LZ不想改變類型可以嘗試這樣,select convert(num as decimal(10,3)) from tb


我以前也尝试你的看法 你的知道显示的时候看到的是2.3 但是我现在解决的是 插入的时候就要显示成2.3


SQL codeselectconvert(YourColumnNameasdecimal(10,1))from YourtbName


從一個Table讀取然后Inert進另一個Table
SQL codeinsertinto tableBselectconvert(YourColumnNameasdecimal(10,1))from YourtbName



 你的意思是我这边还需要建一张表麽? 

#24


Decimal

#25


引用 23 楼 wanglltulong 的回复:
引用 19 楼 takako_mu 的回复:
引用 17 楼 takako_mu 的回复:
引用 15 楼 wanglltulong 的回复:
引用 10 楼 takako_mu 的回复:
    float本就是近似值,它不是精確值。
    通俗點講float是有兩個值的,一個是Text,就是你在DB中看到的數字,如2.3,另一個則是Value,就是它真實的值,也就是2.299999999999.
    所以在做四舍五入、精確的Report、比較(只能用 <、>而不能用=)時請盡量避免使用float類型。建議使用Decimal類型或者Numeric類型。
    如果LZ不想改變類型可以嘗試這樣,select convert(num as decimal(10,3)) from tb


我以前也尝试你的看法 你的知道显示的时候看到的是2.3 但是我现在解决的是 插入的时候就要显示成2.3


SQL codeselectconvert(YourColumnNameasdecimal(10,1))from YourtbName


從一個Table讀取然后Inert進另一個Table
SQL codeinsertinto tableBselectconvert(YourColumnNameasdecimal(10,1))from YourtbName



你的意思是我这边还需要建一张表麽?

你的數據從哪來?你要導到哪里?你是如何導數據的?

#26


用于表示浮点数字数据的近似数字数据类型。浮点数据为近似值;并非数据类型范围内的所有数据都能精确地表示。
语法
float [ ( n ) ]
从 - 1.79E + 308 到 1.79E + 308 之间的浮点数字数据。n 为用于存储科学记数法 float 数尾数的位数,同时指示其精度和存储大小。n 必须为从 1 到 53 之间的值。

#27


我的数据是从程序中手动输入的 

通过model 存入到库中 如果是这样的话 那么修改的时候如何操作? 修改floate 这个类型的字段的值,那麽 那个值该如何处理呢?

#28


引用 27 楼 wanglltulong 的回复:
我的数据是从程序中手动输入的

通过model 存入到库中 如果是这样的话 那么修改的时候如何操作? 修改floate 这个类型的字段的值,那麽 那个值该如何处理呢?

要么在程式中將值定下來,要么修改float的類型,怎么改自己上網查。

#29


检查是否在数据库字段上是否定义了多精度的值,或者在Dataset上定义的字段类型,float本来就是单精度 应该不会出错的 

#30


  恩 好像是没有别的办法 了 我觉得我已经做到死胡同了 

#31


宁外 感谢推荐这个帖子的人 没想到会被推荐 很开心 呵呵 

#32


该回复于2009-09-29 15:49:28被版主删除

#33


建议使用decimal

#34


我就是用decimal解决的。还是别用float了吧。

#35


.

#36


如何解决float类型的2.3 插入到数据库时就成2.29999999999999这个问题?

#37


还是用decimal实在一点

#38


学习重要

#39


lg

#40


学习了

#41



Numeric(24,6)--我们用的

#42


这也推荐?这只能说明现在学.NET开发的基础都不过关,连IEEE 754浮点数是怎么回事都不知道...甚至连存储和显示的原理都不知道...

1.你要用浮点数就必须容忍它们的误差...
2.你要显示什么格式什么精度的数字和存储无关...

看不懂这两点说明你需要先去找本最基础的计算机原理书认真看...

#43


天啦,这也叫问题,你不会四舍五入显示吗?

#44


学些了,谢谢

#45


学些了,谢谢

#46


没积分用了。。。可怜啊。。。。。。。。。。。

#47


不知道你的数据库是什么数据库啊,如果是MS SQL,建议不要用float类型

#48


引用 43 楼 ahjoe 的回复:
天啦,这也叫问题,你不会四舍五入显示吗?


如果是为了显示我也不会费这个功夫提问了 关键是存入到数据库的时候一起开发的人员不希望看到这样的数字
他们说很乱..

#49


引用 42 楼 vrhero 的回复:
这也推荐?这只能说明现在学.NET开发的基础都不过关,连IEEE 754浮点数是怎么回事都不知道...甚至连存储和显示的原理都不知道...

1.你要用浮点数就必须容忍它们的误差...
2.你要显示什么格式什么精度的数字和存储无关...

看不懂这两点说明你需要先去找本最基础的计算机原理书认真看...


我的sql   是不太好 但是这个问题的根源是 float 在什么情况下会是这样的 如果是float 如果不给这样写float[(n)] 它应该是输入是什么 存储什么  但是我的为什么会这样  我们应该不能让设计数据库的人从新设计吧 只有想办法 

#50


数据类型是能改掉的!你所谓的不能改是因为你表里有数据,把数据清空了就可以改了