【Java面经整理】为什么会出现4.0-3.6=0.40000001这种现象?

ps:Java面试题整理专栏,专门收集整理搬运面试题和答案

这种舍入误差的主要原因是:
浮点数值采用二进制系统表示, 而在二进制系统中无法精确地表示分数 1/10。
这 就好像十进制无法精确地表示分数 1/3—样。
如果在数值计算中不允许有任何舍入误差, 就应该使用 BigDecimal类。

浮点数值不适用于无法接受舍入误差的金融计算中。
例如,命令 System.out.println ( 2.0-1.1 ) 将打印出 0.8999999999999999, 而不是人们想象的 0.9。

为什么二进制无法精确表示1/10

其实跟数位表示法有关,比如十进制的情况下:
123,相当于
1*10^2+2*10^1+3*10^0(值*进制^位置,个位0,十位1,百位2)
同理:1/10由二进制表示小数的时候只能够表示能够用1/(2^n)

例如:
0.5能够表示,因为它可以表示成为1/2
0.75也能够表示,因为它可以表示成为
1/2+1/(2^2)
0.875也能够表示,因为它可以表示成为1/2+1/(2^2)+1/(2^3)
0.9375也能够表示,因为它可以表示成为1/2+1/(2^2)+1/(2^3)+1/(2^4)
但是0.1不能够精确表示,因为它不能表示成为1/(2^n)的和的形式


扩展:

大数值

如果基本的整数和浮点数精度不能够满足需求, 那么可以使用java.math 包中的两个 很有用的类:Biglnteger 和 BigDecimal 这两个类可以处理包含任意长度数字序列的数值。 Biglnteger类实现了任意精度的整数运算, BigDecimal 实现了任意精度的浮点数运算。

使用静态的 valueOf方法可以将普通的数值转换为大数值:

Biglnteger a = Biglnteger.valueOf(100); 

遗憾的是,不能使用人们熟悉的算术运算符(如:+ 和 *) 处理大数值。
而需要使用大数 值类中的 add 和 multiply 方法。

Biglnteger c = a.add(b); // c = a + b 
Biglnteger d = c.nultipiy(b.add(Biglnteger.valueOf(2))); // d = c * (b + 2)
注释:

与 C++ 不同, Java 没有提供运算符重载功能。程序员无法重定义 + 和 * 运算 符, 使其应用于
BigInteger 类的 add 和 multiply 运算。Java 语言的设计者确实为字符串的连接重载了 + 运算符,但没有重载其他的运算符,也没有给 Java 程序员在自己的类中重载运算符的机会

java面经-百度准入职老哥整理.pdf》是一份关于百度准入职面试的Java面经整理。这份面经是由百度准入职的老哥整理而成,其中记录了一些面试时可能遇到的问题以及解答方法。 这份面经对于准备参加百度准入职面试的人来说非常有价值。首先,它列出了一些常见的面试问题,涵盖了Java语言的各个方面,包括基础知识、数据结构与算法、设计模式、多线程、网络编程等等。通过仔细研究和复习这些问题的答案,可以帮助面试者全面了解Java语言的特性和应用。 其次,这份面经还提供了问题的解答思路和方法,帮助面试者理清思路,正确回答问题。这对于很多面试者来说特别有帮助,因为在面试时有时遇到一些棘手的问题,有了这份面经的指导,面试者可以更好地掌握应对策略。 不过需要注意的是,面经作为一份参考资料,不能完全依赖于它来准备面试。面试官可能问一些不在面经中列出的问题,因此考生还是需要自己对Java语言有充分的了解,并能够熟练运用。同时,面试官还关注考生的沟通能力、解决问题的能力以及对新技术的学习和掌握能力。 总体来说,《java面经-百度准入职老哥整理.pdf》是一份非常宝贵的资料,可以帮助面试者对Java面试中可能遇到的问题有更深入的了解,提供了解答思路和方法。但记住,面试准备还需要多方面的知识积累和实践经验的积累,才能在面试中展现自己的优势。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值