java - java中number/10和number*0.1的区别

标签 java types

我已经花了 1.5 个小时来解决面试问题,但在我的 Java 程序中找不到错误。 然后我发现问题是什么,我不明白(不要注意值,还有其他问题,这是关于类型的):

int size=100;
Integer a=12;
if(a >= size/10)...
//didn't work

不同
if(a >= size*0.1)...
//worked

我知道存在转换,但是,a=12 时,if(a>=size/10) 怎么可能返回 false?

这是为什么?

最佳答案

/10整数除法。而*0.1首先将第一个操作数转换为 double并执行浮点乘法

如果您使用/10 ,操作数为14 ,这将导致 1确实,14/10=1.4但整数除法会向下舍入此值。因此29/10=2 .

如果您使用*0.1 ,Java编译器首先会转换size的值为 double ,因此 14.0然后将其乘以 0.1导致 1.4 .

另一方面,浮点并不都是美妙的。 floatdouble不能代表所有整数,计算后四舍五入。

对于 size 的给定值但是,它会产生这样的效果,因为 10010 的倍数和一个 floatdouble能够表示从零到百范围内的任何整数值。

最后/10并不总是整数除法:如果第一个操作数是浮点(例如 14.0d/10 ),编译器会将其转换为浮点除法

简短版本:

  • int/int是一个整数除法,向下舍入到最接近的(较低)整数。
  • int*double是一个双倍乘法,它 - 带有舍入误差 - 产生最接近正确结果(带十进制数字)的浮点值。

关于java - java中number/10和number*0.1的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27680271/

相关文章:

java - 使 super 方法停止实现的方法

haskell - 在 Haskell 中统一类型

php - CodeIgniter Active Record 返回 Mysql 数据类型而不仅仅是字符串

c++ - 在 C++ 中进行类型转换的简短而优雅的方法?

java - 动态外部类加载

java - 无法解压 EPub 文件

Java : verifying if an object already exists in a List?

math - Julia 中具有函数字段的不可变类型

java - Couchbase 集群的连接状态

java - Android Studio重构问题