Java - 使用 double 更精确

Java - Be more precise with double

提问人:Creart 提问时间:3/11/2020 更新时间:3/11/2020 访问量:67

问:

我目前正在为 uni 编写一个项目,我想知道是否有任何好的做法可以更精确地使用双精度值。也就是说,如果我直接在 return 语句中只写一个长表达式,精度是否有任何差异,或者如果我将表达式拆分为变量会更好(顺便说一下,使其更具可读性)?例如,想象一下,如果我有以下公式:;这样写好吗?finalMath.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;

先谢谢你!

Java 浮点 精度

评论

1赞 Arnaud Denoyelle 3/11/2020
恕我直言,编译器无论如何都会对其进行优化,因此这两种方式都可能导致相同的字节码。如果要查找任意精度,则可能需要使用BigDecimal
0赞 SephB 3/11/2020
Double 对于几乎任何可能的用例都足够精确。我会问自己为什么我认为我需要更精确并解决这个问题。也就是说,如果出于某种原因您确实需要这种精度,那么BigDecimal就是您的不二之选。
0赞 Maarten Bodewes 3/11/2020
final将只确保变量在初始化后无法赋值(即设置为一个值)。对于局部变量,这主要只是为了有利于维护/可读性;除此之外,它什么都不做。

答:

2赞 Bathsheba 3/11/2020 #1

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

就我个人而言,我会写

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

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

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