在最近的开发当中碰到了一个问题 用的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 对比只是无意中发现的。代码中肯定不会用这两个去对比的
主要就是想知道 为什么两个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)