三元表达式的计算问题

大家好,下面这一段代码是根据personTypeCode(已知的)来计算结果的,guaranteeSalary 是一个常量 已知的int值,coefficient是一个已知的double值,
为什么计算出来的是 0 ?
clipboard.png

补充一下,为什么 (4/9) 等于 0

clipboard.png

阅读 5.5k
12 个回答

转换成float再计算除法,比如4.0 / 9

针对这个问题,我觉得采用Bigdecimal 精确浮点计算 比较好。

这个问题比较经典,特别在计算跟金钱有关的数据的时候,容易出现这样的问题,钱数的加减乘除,如果不精确计算,碰到数据量大的计算时候 可能计算出来的结果差异很大。

确定没有少括号???最后那个括号对应的什么

"w".equals(user.getPersonTypeCode())true时,取4 / 9等于0

guaranteeSalary * 0 + guaranteeSalary * ce.getCoefficient().doubleValue()

ce.getCoefficient().doubleValue()为0
则计算结果就是0

我能想到的是,你保存这个结果的变量是 double 类型吗?

另外 4 / 9 = 0 可以看楼下的说明,刚才我说错了。


对于这种不同 PersonType 不同取值的情况,个人的习惯是定义一个静态 Map 来存各种条件下的取值

private static final Map<String, Integer> valueMap;

static {
    valueMap = new HashMap();
    valueMap.put("A", 1);
    valueMap.put("W", 4 / 9);
}

public void func() {
    guaranteeSalary * 
        // getOrDefault 是 Java 8 添加的,如果 JDK 版本不满足,可以自行添加该方法
        (valueMap.getOrDefault(user.getPersonTypeCode(), 1) +
         ce.getCoefficient().doubleValue());
}

Java中int类型/int类型返回值还是int类型,也就是说4/9的结果等价于0余4,所以4/9=0,
解决方法可以更改4或9的任何一个为浮点类型,例如4.0/9这样结果就会变成浮点类型了。

希望对你有帮助^_^

三元运算符具有右结合性 也就是说A op B op C 等价于 A op (B op C)
所以你的表达式a? 1 : b ? (4/9) :1 等价于a? 1 : (b ? (4/9) :1 )
a不成立则直接判断b ? (4/9) :1
那么现在b成立了结果是(4/9).
问题来到了为什么4/9等于0.
因为4/9是个整除 整除的话4/9就是0.
你想得到正确结果 你试试4/9.0,进行浮点数运算。

分子分母都是整型的,结果还应当是整型,所以舍弃了小数点儿。让分子或者分母成为float,结果就会靠近float而不是int了

4/9=0.4444444444444,四舍五入就是0,进一法那就是1

4/9 结果转为int类型,因为结果小于1大于0 , 所以结果取0

4/9 结果转为int类型,取舍方式是小数点后全部舍弃,所以结果取0

4/9 结果转为int类型,取舍方式是小数点后全部舍弃,所以结果取0

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题