【问题标题】:Java - Be more precise with doubleJava - 使用 double 更精确
【发布时间】:2020-06-22 14:48:01
【问题描述】:

我目前正在为 uni 编写一个项目,我想知道是否有任何好的做法可以更精确地使用双值。也就是说,如果我直接在 return 语句中编写一个长表达式,精度是否有任何差异,或者如果我将表达式拆分为 final 变量会更好(顺便说一下,使其更具可读性)?例如,假设我有以下公式:Math.sin(a) / Math.cos(b) + Math.tan(c) / d;像下面这样写更好吗?

final double sinA = Math.sin(a);
final double cosB = Math.cos(b);
final double tanC = Math.tan(c);
return sinA / cosB + tanC / d;

提前谢谢你!

【问题讨论】:

  • 恕我直言,编译器无论如何都会对其进行优化,因此两种方式都可能产生相同的字节码。如果您正在寻找任意精度,您可能需要使用BigDecimal
  • Double 对于几乎任何可能的用例来说都足够精确。我会问自己为什么我认为我需要更精确并解决这个问题。也就是说,如果出于某种原因您确实需要这种精度,那么 BigDecimal 就是要走的路。
  • final 将确保变量在初始化后不能被分配(即设置为一个值)。对于主要只是为了维护/可读性的局部变量;除此之外,它不会做任何事情。

标签: java floating-point double precision floating-accuracy


【解决方案1】:

如果您的 JVM / JIT 正确实现了 Java 语言规范所要求的 IEEE754,则不会有任何区别。

我个人会写

double ret = Math.sin(a) / Math.cos(b) + Math.tan(c) / d;
return ret;

因为这使我可以在return ret; 语句上设置一个断点,这使我可以在没有花哨的调试工具的情况下检查返回值,而生产服务器上凌晨 3 点可能无法使用这些工具!我发现您编写它的方式不清楚:依赖变量名称比标准函数名称更容易重构损坏。

您可以相信编译器会优化掉额外的变量ret

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    • 2023-02-22
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    相关资源
    最近更新 更多