Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 精确数学计算_Java_Android - Fatal编程技术网

Java 精确数学计算

Java 精确数学计算,java,android,Java,Android,我有一个问题,我正在开发一个应用程序,应该能够做一些数学计算。这些计算必须精确,或者说没有明显的错误 但是这个简单的代码 double a = 3.048d; double b = 1000d; double c = a / b; 给我一个错误的结果,c不是预期的0.003048,而是0.00304800000000004,这显然是错误的 double d = 3.048 / 1000; 第二个代码snipet给出了正确的结果 我知道当用计算机计算时,所有浮点运算都不精确,但我不知道如何

我有一个问题,我正在开发一个应用程序,应该能够做一些数学计算。这些计算必须精确,或者说没有明显的错误

但是这个简单的代码

double a = 3.048d;
double b = 1000d;

double c = a / b;
给我一个错误的结果,c不是预期的0.003048,而是0.00304800000000004,这显然是错误的

double d = 3.048 / 1000; 
第二个代码snipet给出了正确的结果

我知道当用计算机计算时,所有浮点运算都不精确,但我不知道如何解决这个问题

提前谢谢! 路德维希

发展: -安卓2.2 测试设备: -HTC Desire使用a进行精确的浮点计算。通过设置比例,您可以精确地指定要输出的距离

import java.math.BigDecimal;

class Test{

        public static void main(String[] args){
                BigDecimal a = new BigDecimal("3.048");
                BigDecimal b = new BigDecimal(1000);
                BigDecimal c = a.divide(b).setScale(6);
                System.out.println(c); //0.003048
        }
}
使用BigDecimal进行精确分配


顺便说一句,d的结果显然是正确的,因为double的机器编码无法存储结果,您认为这是正确的。

准确感知所需的是对象:


这是错误的结果,而不是错误。要处理它,请将结果四舍五入到适当的精度

嘿,johncarl,非常感谢你在创建新的BigDecimal时用字符串给出的提示。我想这可能是我以前使用BigDecimal时遇到的问题。我不知道你以前指的是什么问题,但你也可以将3.048表示为:BigDecimal a=new BigDecimal3048.dividenew BigDecimal1000
BigDecimal a = new BigDecimal("3.048");
BigDecimal b = new BigDecimal(1000);

BigDecimal c = a.divide(b);

System.out.println(c); //0.003048