日期:2014-05-17  浏览次数:20697 次

关于 double 与 float 类型的问题
在最近的开发当中碰到了一个问题 用的Vs2008
double a = 10.64;
float b = 10.64f;
我在进行两个值比较的时候 B大于A
但是如果是
double a = 10.32;
float b = 10.32f;
那么就是  A大于B了 可能就是精度的问题他们在各自四舍五入的情况下长度就不一样了。但是程序里面检测的值是一样的。费解
最纠结的莫过于
double aaa =(Convert.ToDouble("877.80") + Convert.ToDouble("-6.32"));
坑爹啊 为什么得出来的是871.4999999 呢? 


还有
我有一个存储过程
  --@A1 nvarchar(50) output, 
 --@A2 nvarchar(50) output  这两个都是存储过程返回结果 值都都一样的为11905750
 --SELECT @A1=sum(GuoJBTE*ShuL) as A1  FROM Tbl_Apply1 
-- SELECT @A2=[gbzj] FROM t_FeiY

然后我后台代码
↓↓这个接收的@A1  SY得到的值却是11900600.0 然后ToDouble()里面选中添加监视的值是1.19006e+007
 Double SY= Convert.ToDouble(db.GetParameterValue(cmd11, "@A1").ToString())

↓↓这个接收的@A2 FP得到的值就是11905750.0 然后ToDouble()里面选中添加监视的值也是11905750.0
Double FP = Convert.ToDouble(db.GetParameterValue(cmd11, "@guobfp").ToString());


虽然说是两个语句检索的值 但是结果是一样的 返回的类型也一样 接收后强转方式也一样 为什么最后的值就不一样了?  很奇怪 费解!!!! 有木有大神 解答一下
------最佳解决方案--------------------
对于小数,最好的方法是采用高精确数值类型: decimal  你可用百度 搜索一下这个类型的用法, 一看就明白.

------其他解决方案--------------------
decimal SY= Convert.ToDecimal(db.GetParameterValue(cmd11, "@A1").ToString()) 

添加监视看一看这是什么效果.
------其他解决方案--------------------
为什么要一会 float 一会 double 呢?搞个统一的不行吗
------其他解决方案--------------------
float与Double 对比只是无意中发现的。代码中肯定不会用这两个去对比的
主要就是想知道 为什么两个Double 相加一个为负数算出来的值就是871.499999
还有就是得到存储过程值的问题
------其他解决方案--------------------
引用:
为什么要一会 float 一会 double 呢?搞个统一的不行吗



float与Double 对比只是无意中发现的。代码中肯定不会用这两个去对比的
主要就是想知道 为什么两个Double 相加一个为负数算出来的值就是871.499999
还有就是得到存储过程值的问题 
------其他解决方案--------------------
float = *.f  貌似会根据值进行四舍五入!


哥们以前无聊的时候,也高过!


现在,就不去纠结那些了!反正也用不到!知道是那么回事就ok!

------其他解决方案--------------------
871.4999999  这个应该是871.47999999
------其他解决方案--------------------
double
float 
精确是不够的,它在小数点后四位的时候会出现与电脑电压跳动有关的数值变动.
------其他解决方案--------------------
搞晕了。。
这个接收的@A1  SY得到的值却是11905800.0 然后ToDouble()里面选中添加监视的值是一个科学计数法 值貌似是十位进百位了
 Double SY= Convert.ToDouble(db.GetParameterValue(cmd11, "@A1").ToString())
------其他解决方案--------------------
数据库里面 如果 nvarchar @A1=sum(flot*int) 位数过多的话 @A1就会变成科学计数法 所以@A1类型要用decimal类型的。 程序后太中 小数相加 也使用decimal 类型的相加计算会更加精准。
程序中 好像Double类型与Float都是近似保存。比如我保存的5  可能就给保存成了4.999999999999 或者是5.000000000001  
------其他解决方案--------------------
正常开的时候,无论是数据库还是代码都会用decimal

oralce 用number(即使定义为decimal,oralce也只认number)