A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王松朝 金牌黑马   /  2011-7-20 13:20  /  2079 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

System.out.println((float)3.141500349);的打印结果居然是3.1415002
之前用别的小数测试的时候都挺好的,虽然也不是原来的数,但之前都是按最后一位四舍五入变化的,怎么这个倒变小了?

5 个回复

倒序浏览
黑马网友  发表于 2011-7-20 13:32:52
沙发
这是一个float精度的问题,println打印时,java将float装成String,在转换的时候会进行一个精度的截断。
这个和计算机组成原理的知识有关,和二进制的存储方式有关,float有效存储位是23位,超出的就会被截断。

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1 我很赞同

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-20 13:35:18
藤椅
float 精度还是有误差啊 用double吧
回复 使用道具 举报
原帖由 lihaihan 于 2011-07-20 13:35 发表 float 精度还是有误差啊 用double吧


double也容易丢精度呀!用BigDecimal类吧!
BigDecimal b1 = new BigDecimal ("0.022222 ");不过要注意,创建对象时候,一定要用String对象作为构造参数,如果用double类型,依然会丢失数据。

评分

参与人数 1技术分 +2 收起 理由
admin + 2 哎、说到我心里去了

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-20 13:50:02
报纸

回复 板凳 的帖子

受教了,多谢 琚臻臻 老大!
回复 使用道具 举报
黑马网友  发表于 2011-7-20 16:26:03
地板
计算机不能识别除二进制数据以外的任何数据,精度很高的浮点数在编译成二进制时出现偏差,输出时并没有进行四舍五入。float和double只能用作科学计算或者工程计算,在商业计算等精确计算中就要用math.BigDecimal进行处理了。

评分

参与人数 1技术分 +2 收起 理由
admin + 2 这也是一位专业人士,原理分析很到位

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马