【问题标题】:How to avoid the pitfall of implicit conversion to int that makes 7/8*pi = 0如何避免隐式转换为 int 导致 7/8*pi = 0 的陷阱
【发布时间】:2015-03-13 07:57:31
【问题描述】:

太多次,我编写了诸如 double t = 7/8*pi 之类的代码,结果却发现,在那之后 t 等于 0。为什么?因为隐式转换为 int。通过重新排列数字 double t = 7*pi/8 可以获得正确的结果。现在提名人是双重的,没有转换发生。 (或双倍 t = 7d/8*pi 或 7f 或 7.0 或 ...)

问题是,弄错太直观了!

我该如何预防呢?将隐式转换完全转换为 int 是否有意义,我该怎么做?

【问题讨论】:

  • 确实明智的语言通常为整数除法提供单独的运算符。 (Pascal,Algol68 DIV,也见 ÷)。对语言开发人员的更多提示。

标签: int implicit-conversion


【解决方案1】:

这不是优先级的问题吗?我所做的是使用 7.0 或 8.0,因为我知道我想避免整数运算。习惯了就好了。

【讨论】:

    【解决方案2】:

    在 Java 中,FindBugs 可能会警告此类构造。

    ICAST:整数除法结果转换为双精度或浮点数 (ICAST_IDIV_CAST_TO_DOUBLE)

    此代码转换整数除法的结果(例如,int 或 long 除法)操作加倍或浮动。对整数进行除法 将结果截断为最接近零的整数值。事实 结果被转换为 double 表明这种精度应该 已被保留。可能的意思是投射其中一个或两个 在执行除法之前将操作数加倍。这是一个 示例:

    int x = 2;
    int y = 5;
    // Wrong: yields result 0.0
    double value1 =  x / y;
    
    // Right: yields result 0.4
    double value2 =  x / (double) y;
    

    【讨论】:

      猜你喜欢
      • 2012-04-15
      • 2019-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-16
      • 2012-02-14
      • 1970-01-01
      相关资源
      最近更新 更多