Java 如何在android中使用double获得精确位的答案

Java 如何在android中使用double获得精确位的答案,java,android,double,floating-accuracy,floating-point-precision,Java,Android,Double,Floating Accuracy,Floating Point Precision,我已经在android上制作了一个计算器应用程序,但每当我做这种乘法运算时: 23.3 x 3.3 我得到的答案是: 76.988999999999 现在请告诉我如何解决此应用程序的冲突。答案应该是这样的 76.89 你的问题不清楚。我猜你想得到确切的答案 DecimalFormat df = new DecimalFormat(".##"); String result = df.format(76.988999999999); 编辑 学习此十进制格式的示例 import java.t

我已经在android上制作了一个计算器应用程序,但每当我做这种乘法运算时:

23.3 x 3.3
我得到的答案是:

76.988999999999
现在请告诉我如何解决此应用程序的冲突。答案应该是这样的

76.89

你的问题不清楚。我猜你想得到确切的答案

DecimalFormat df = new DecimalFormat(".##");
String result = df.format(76.988999999999);
编辑 学习此十进制格式的示例

import java.text.DecimalFormat;

class Demo {
    public static void main(String args[])  
    {
        double b = 756.988999999999;
        DecimalFormat df = new DecimalFormat(".##");
        String result = df.format(b);
        System.out.printf(result);  
    }
}
欢迎来到人类的世界。在这种特殊情况下,您可以通过以下方式获得更好的结果,而不是双倍:


…但是BigDecimal有它自己的问题,例如,尝试10/3。但对于计算器应用程序来说,它可能是一个更好的选择,请记住,在除法时,您可能需要使用。请务必阅读课程的详细信息,以便理解其规模概念。

请澄清您的问题。如果您想要精确的算术:不要使用浮点或双精度。我应该使用什么来消除这个问题?消除什么?你希望结果如何?@Smith42:这取决于你想要什么样的确切结果。如果您使用BigDecimal并尝试10/3,您也会遇到类似的问题。但我不知道用户将输入什么,答案是否为123.4567?那么我之前如何定义格式?@HimanshuAggarwal我已经编辑了答案。现在它将适合你的要求。它不适合我。假设我使用2个双变量c&d,并允许用户使用Scanner类输入值,然后将示例中的23.3和3.3替换为c&d resp。然后答案是:76.88999999999820587959220574690445766638900334550912342955475420325228697038 255631923675537109375现在告诉我应该用什么?@HimanshuAggarwal:我告诉过你:使用大十进制,而不是双精度。如果你在任何地方都有双精度,你会遇到IEEE-754浮点固有的误差。IEEE-754是为速度而设计的,为了达到这一目的,它牺牲了一些精度。经典示例为0.1+0.2,在IEEE-754中,其结果为0.300000000000000004。BigDecimal是以牺牲速度为代价,在进行十进制计算时,为了精确而设计的。我对此进行了探索,并找到了使用它的方法。我实际上想从用户那里获取输入,这样就得到了double,然后把它变成一个字符串,我可以把它传递给BigDecimal,问题就解决了。谢谢你的邀请help@HimanshuAggarwal:如果您从用户处获取输入,为什么不首先将其作为字符串接受?不要先通过双精度测试,那样会导致不准确。
import java.math.*;

public class BigCheck {
    public static final void main(String[] args) {
        BigDecimal a = new BigDecimal("23.3");
        BigDecimal b = new BigDecimal("3.3");
        System.out.println(a.multiply(b));
    }
}