double ddd = 16.24; // 默认情况下,Double 值的精度是 15 个十进制位,但内部维护最大精度是 17 位
ddd = ddd * 100;断点看ddd是1623.99999...991将double ddd = 16.25 或者 16.23 乘以100就是正常的 1625.00 和 1623.00 是什么原因?
ddd = ddd * 100;断点看ddd是1623.99999...991将double ddd = 16.25 或者 16.23 乘以100就是正常的 1625.00 和 1623.00 是什么原因?
解决方案 »
- |ZYCWPF| 为什么Style.DataTragger中的Setter无法设置Text属性,是不是这个只能设置样式,而数据字段不可以设置呢?
- 急急急!一点小需求!求简单分析一下!(参与者最少给阳光普照奖)
- 三层架构中,业务层的含义?
- 急。。USB接口的小票打印机,调用问题。
- winform的dataGridView里的问题``高手进```在线等~~急
- 关于文件下载
- 请问大家,程序升级的问题
- 字符串操作!c# 大家帮我一下把 !不是很难
- 高分求一解两个不同地的数据库(也不同名)但都有一张相同的表tbl_ExamFieldInfo现在就是要比较这两张表,如果下级数据库的这个表同上级
- 紧急:2002 Visual Strudio.net哪个安装盘中含有frame?
- 弹出窗口
- 怎么把 WebChartControl 绘制的图导入Excel中
所以一般doble、float等类型比较不能直接用==,而是允许一定范围的误差
如:
double a=...;
if(Math.abs(a-0.5)<0.000001) //就认为a==0.5
你可以用decimal
decimal ddd = 16.24M;
ddd = ddd * 100;
如果要理解为什么ddd乘以100就等于1624,那么你要从二进制去理解,而不是从16.23999999999999....去理解。
那么二进制中 ,小数点后第一位就是 0.5(2^-1),第二位就是 0.25 (2^-2).
同理,10 进制中每个小数小数点后表示为 d = n*0.1 + k*0.01 + m*0.001 + .......
二进制中,小数点后表示为 d = n*0.5 + k*0.25 + m*0.125 + ...;
那么对于小数数据,不管是double,float等,除了极个别的小数(比如16.25, 16.125)能精确表示(这意味着这些数能精确分解为上面的一个有限数列),其他都不能精确表示(就是只能分解为一个无穷的二进制数列)。这就是说小数是精确的。。