问一个关于浮点数的问题

影游 2014-08-30 01:08:29
(1)使用java,
System.out.print(2.0 - 1.1);

产生结果0.8999999999999999

(2)使用C#,
Console.writeline(2.0 - 1.1)

结果:0.9

谁能解释上面的原因,难道java不如C#智能?最近刚刚从C# 转java,感觉很多东西不太明白,

书上说,这个是二进制编码问题,难道C# 就没有二进制编码问题,谁能更深入的说一下.

谢谢...
...全文
227 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
@computervip 2014-09-26
  • 打赏
  • 举报
回复
这是计算机的逻辑,跟人的脑子不一样,计算机的思想都是二进制的,原码,补码,反码,有很多人的结果计算机未必是一样的,任何事物都有误差,就像圆周率π一样,有精确地值吗???
影游 2014-09-18
  • 打赏
  • 举报
回复
引用 9 楼 dring321 的回复:
[quote=引用 5 楼 boyingyou 的回复:] [quote=引用 2 楼 wlwlwlwl015 的回复:] java采用的是二进制系统,所以浮点数运算有时没法得到精确值,还记得十进制的小数位转二进制吧,就是这个道理,就像十进制没法精确表示1/3一样,所以如果运算需要精确值,就用BigInteger或者BigDecimal。
谢谢你的回答,但是为什么C# 可以做到呢? 因为这样的计算确实在实际应用中给我很大的不便啊...[/quote] 楼主是C#转java的吗?不如你把这个问题放在C#的版块上问完后告诉我们[/quote] 我确实是从C#转java的,刚刚接触java一个月而已.谢谢大家帮助...
humanity 2014-09-02
  • 打赏
  • 举报
回复

System.out.print(2.0f - 1.1f);  // 正常。
System.out.print(2.0d - 1.1d);  // 不正常。
huasuoworld 2014-08-31
  • 打赏
  • 举报
回复
四舍五入取小数点后一位。

System.out.println(new BigDecimal(2.0-1.1).setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue());
代码间的舞者 2014-08-31
  • 打赏
  • 举报
回复
引用 5 楼 boyingyou 的回复:
[quote=引用 2 楼 wlwlwlwl015 的回复:] java采用的是二进制系统,所以浮点数运算有时没法得到精确值,还记得十进制的小数位转二进制吧,就是这个道理,就像十进制没法精确表示1/3一样,所以如果运算需要精确值,就用BigInteger或者BigDecimal。
谢谢你的回答,但是为什么C# 可以做到呢? 因为这样的计算确实在实际应用中给我很大的不便啊...[/quote] 楼主是C#转java的吗?不如你把这个问题放在C#的版块上问完后告诉我们
姜小白- 2014-08-31
  • 打赏
  • 举报
回复
引用 4 楼 boyingyou 的回复:
所以嘛,我很好奇C#是怎么做到的,神奇啊...
c# 不懂了,没接触过
vnvlyp 2014-08-31
  • 打赏
  • 举报
回复
引用 5 楼 boyingyou 的回复:
[quote=引用 2 楼 wlwlwlwl015 的回复:] java采用的是二进制系统,所以浮点数运算有时没法得到精确值,还记得十进制的小数位转二进制吧,就是这个道理,就像十进制没法精确表示1/3一样,所以如果运算需要精确值,就用BigInteger或者BigDecimal。
谢谢你的回答,但是为什么C# 可以做到呢? 因为这样的计算确实在实际应用中给我很大的不便啊...[/quote] C#和Java处理浮点数可能不相同而已,这有什么不便么? 如果你需要保留X位小数就再格式化一下不就好了
影游 2014-08-30
  • 打赏
  • 举报
回复
引用 2 楼 wlwlwlwl015 的回复:
java采用的是二进制系统,所以浮点数运算有时没法得到精确值,还记得十进制的小数位转二进制吧,就是这个道理,就像十进制没法精确表示1/3一样,所以如果运算需要精确值,就用BigInteger或者BigDecimal。
谢谢你的回答,但是为什么C# 可以做到呢? 因为这样的计算确实在实际应用中给我很大的不便啊...
影游 2014-08-30
  • 打赏
  • 举报
回复
引用 1 楼 magi1201 的回复:
java中double型是非精确存储的,说白了,存的可能是近似值 两个近似值相减,得到的就是近似值了 可以使用BigDecimal 进行精确运算
所以嘛,我很好奇C#是怎么做到的,神奇啊...
S117 2014-08-30
  • 打赏
  • 举报
回复
浮点数本来就不精确,去看下IEEE754标准吧
小灯光环 2014-08-30
  • 打赏
  • 举报
回复
java采用的是二进制系统,所以浮点数运算有时没法得到精确值,还记得十进制的小数位转二进制吧,就是这个道理,就像十进制没法精确表示1/3一样,所以如果运算需要精确值,就用BigInteger或者BigDecimal。
姜小白- 2014-08-30
  • 打赏
  • 举报
回复
java中double型是非精确存储的,说白了,存的可能是近似值 两个近似值相减,得到的就是近似值了 可以使用BigDecimal 进行精确运算

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧