相关疑难解决方法(0)

在Java中保留double的精度

public class doublePrecision {
    public static void main(String[] args) {

        double total = 0;
        total += 5.6;
        total += 5.8;
        System.out.println(total);
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码打印:

11.399999999999
Run Code Online (Sandbox Code Playgroud)

我怎么才能打印(或能够用它)11.4?

java floating-point precision double

134
推荐指数
11
解决办法
19万
查看次数

如何比较Java中的两个double值?

Java中两个double值的简单比较会产生一些问题.让我们考虑Java中的以下简单代码片段.

package doublecomparision;

final public class DoubleComparision 
{
    public static void main(String[] args) 
    {
        double a = 1.000001;
        double b = 0.000001;

        System.out.println("\n"+((a-b)==1.0));
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码似乎返回true,表达式的评估((a-b)==1.0)却没有.它会返回,false因为对此表达式的求值0.9999999999999999实际上是预期的1.0,1.0因此不等于,因此条件求值为boolean false.克服这种情况的最佳方法是什么?

java

50
推荐指数
3
解决办法
16万
查看次数

为什么Double.parseDouble使9999999999999999变为10000000000000000?

为什么是Double.parseDouble制作999999999999999910000000000000000?例如 :

Double d =Double.parseDouble("9999999999999999");
String b= new DecimalFormat("#.##").format(d);
System.out.println(b);
Run Code Online (Sandbox Code Playgroud)

IS打印

10000000000000000
Run Code Online (Sandbox Code Playgroud)

相反,它必须显示99999999999999999999999999999999.00

非常感谢任何形式的帮助.

java double

17
推荐指数
3
解决办法
4020
查看次数

奇怪的Java行为:为什么添加两个小数点后面的两个小数会产生双倍超过两位小数?

如果我有一个双精度数组,每个都有两个小数位,通过一个循环完全添加它们,并打印出总数,出来的是一个超过两位小数的数字.这很奇怪,因为从理论上讲,添加两个数字,每个数字只有2个,只有2个小数位,所以不会产生一个超过百分位数的非零数字的数字.

尝试执行此代码:

double[] d = new double[2000];
for (int i = 0; i < d.length; i++) {
    d[i] = 9.99;
}

double total = 0,00;
for (int i = 0; i < d.length; i++) {
    total += d[i];
    if (("" + total).matches("[0-9]+\\.[0-9]{3,}")) { // if there are 3 or more decimal places in the total
        System.out.println("total: " + total + ", " + i); // print the total and the iteration when it occured
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的电脑中,打印出:

total: 59.940000000000005, 5 …
Run Code Online (Sandbox Code Playgroud)

java

17
推荐指数
2
解决办法
1万
查看次数

这个简单的"双重"计算有什么问题?

在java中这个简单的"双重"计算有什么问题?

我知道一些十进制数字不能正确地用float/double二进制格式表示,但是使用变量d3,java能够存储并显示2.64而没有任何问题.

double d1 = 4.64;
double d2 = 2.0;
double d3 = 2.64;
double d4 = d1 - d2;

System.out.println("d1      : " + d1);
System.out.println("d2      : " + d2);
System.out.println("d3      : " + d3);
System.out.println("d4      : " + d4);
System.out.println("d1 - d2 : " + (d1 - d2));
Run Code Online (Sandbox Code Playgroud)

回答,

d1      : 4.64
d2      : 2.0
d3      : 2.64
d4      : 2.6399999999999997
d1 - d2 : 2.6399999999999997
Run Code Online (Sandbox Code Playgroud)

java double-precision

10
推荐指数
2
解决办法
1万
查看次数

加倍我的钱:我的框架使用双倍金额

我继承了一个货币金额使用双重类型的项目.

更糟糕的是,它使用的框架和框架自己的类使用双倍的金钱.

框架ORM还处理从数据库(和存储)到数据库的值的检索.在数据库中,货币值是类型编号(19,7),但框架ORM将它们映射到双精度数.

如果没有完全绕过框架类和ORM,我能做些什么来准确计算货币价值?

编辑:是的,我知道应该使用BigDecimal.问题是我与一个框架紧密相关,例如,类framework.commerce.pricing.ItemPriceInfo有成员double mRawTotalPrice; 和双mListPrice.我公司的应用程序自己的代码扩展了,例如,这个ItemPriceInfoClass.

实际上,我不能对我的公司说,"废弃两年的工作,花费数十万美元,基于此框架的代码,因为四舍五入的错误"

java double currency

9
推荐指数
2
解决办法
625
查看次数

比较Java中的相等的双重值.

我想从那些double在Java中使用原始相等经验的人那里得到一些建议.使用d1 == d2两个双打d1并且d2由于可能的舍入误差而不够.

我的问题是:

  1. Java是否Double.compare(d1,d2) == 0在某种程度上处理舍入错误?如1.7文档中所述,0如果d1在数值上等于,则返回值d2.是否有人确定它们在数值上是什么意思?

  2. 对某些delta值使用相对误差计算,是否会推荐使用delta的通用(非特定于应用程序)值?请参阅下面的示例.

下面是考虑相对误差来检查相等性的通用函数.delta您建议从简单的操作+, - ,/,*操作中捕获大多数舍入错误的价值是多少?

public static boolean isEqual(double d1, double d2) {
    return d1 == d2 || isRelativelyEqual(d1,d2);
}

private static boolean isRelativelyEqual(double d1, double d2) {
    return delta > Math.abs(d1- d2) / Math.max(Math.abs(d1), Math.abs(d2));
}
Run Code Online (Sandbox Code Playgroud)

java double double-precision

9
推荐指数
1
解决办法
3万
查看次数

在Java中,如何测试"Double"列表是否包含特定值

背景:浮点数具有舍入问题,因此不应将它们与"=="进行比较.

问题:在Java中,如何测试列表是否Double包含特定值.我知道各种解决方法,但我正在寻找最优雅的解决方案,可能是使用Java或第三方库功能的解决方案.

import java.util.ArrayList;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        // should be 1.38, but end up with 1.3800000000000001
        Double d1 = new Double(1.37 + 0.01);
        System.out.println("d1=" + d1);

        // won't be able to test the element for containment
        List<Double> list = new ArrayList<Double>();
        list.add(d1);
        System.out.println(list.contains(1.38));
    }
}
Run Code Online (Sandbox Code Playgroud)

输出是:

d1=1.3800000000000001
false
Run Code Online (Sandbox Code Playgroud)

谢谢.

java floating-point

7
推荐指数
1
解决办法
2772
查看次数

将大十进制数转换为没有指数格式的双精度数

我正在对高十进制精度 BigDecimal 对象进行计算。

我正在使用需要双精度参数的第三方库。当我尝试将其转换为 double 时,我得到的是指数格式而不是小数格式的值。

BigDecimal 0.000035000000000
Double 3.5E-5
Run Code Online (Sandbox Code Playgroud)
BigDecimal bd; 
BigDecimal(0.0000349999999995631583260546904057264328002929687500);
bd= bd.setScale(15,BigDecimal.ROUND_CEILING);

Log.i("bd","bd "+bd.toPlainString());
Log.i("bd","double"+bd.doubleValue());
Run Code Online (Sandbox Code Playgroud)

我发现了多种方法可以将这个 3.5E-5 值转换为正确的十进制点数,但仅限于字符串格式。而我需要双倍的价值

能够在 String 对象中没有指数但不是双

  DecimalFormat df = new DecimalFormat("#");
        df.setMaximumFractionDigits(16);
       String test=df.format(bd,doubleValue());
        System.out.println("op2 "+test);
        Double test1=Double.parseDouble(test);
        System.out.println("op2 "+test1);
Run Code Online (Sandbox Code Playgroud)

输出 op2 .000035 op2 3.5E-5

自从几天以来,我一直在努力寻找解决方案,因为我无法控制需要值加倍的 3rd 方库

推荐链接

格式 BigDecimal 不带科学记数法全精度

将java中的指数值转换为数字格式

Java中从指数形式到十进制的转换

如何解决 Java 四舍五入问题

没有 E 的 Java BigDecimal

如何避免使用科学记数法?

我的问题与这些链接不同,我不希望 double 作为没有指数的字符串,而我只希望它采用 double 格式。

编辑

如果传递的 double 值是指数格式,则基于 NDK 的库将进一步对此对象进行计算,这将导致更多的小数点和更大的指数值。所以,我想传递一个没有 E 的简单 double

java double android bigdecimal

3
推荐指数
1
解决办法
1万
查看次数

Java编译优化和性能

 public static void main(String[] args) {
     double [] boxes;
        boxes = new double[]  {20, 10, 5, 40, 20, 41, 41, 2, 6, 7, 3, 4, 5, 6, 23, 34, 7, 8, 2, 2};
        double heaviest = 0;
        double normal = 0;
        double heavy = 0;
        double totalCost;
        double a = 0;
        double b = 0;
        int repeatCount=0;

        for (int i = 1; i < boxes.length; i++) {
            if (boxes[i] > heaviest)
                heaviest = boxes[i];
        }

        for(double element: boxes) {
            if(element==heaviest) …
Run Code Online (Sandbox Code Playgroud)

java arrays compiler-optimization

2
推荐指数
1
解决办法
80
查看次数

如何检查两个双精度值中较大和较小的值?

我有两个double值,我想通过比较两个值来检查是否相等或更大相等或更小

我已经在互联网上搜索并阅读了其他相关的 SO 问题,但找不到解决方案。

我所能找到的是,如何比较两个double值,

     int returnVal = Double.compare(d1, d2);
Run Code Online (Sandbox Code Playgroud)

但是我如何检查d1 <= d2d1 >= d2

编辑:

double remRangeInKm;
if (remRange == 200 || remRange == 500){
     if (remRange == 200) remRangeInKm = 0.2;
     else remRangeInKm = 0.5;
}
else remRangeInKm = remRange * 1.0;

int earthRadius = 6371; //in km
double distance = Math.abs(Math.acos(Math.sin(remLatitude)*Math.sin(currentLatitude)
              + Math.cos(remLatitude)*Math.cos(currentLatitude)
              * Math.cos(currentLongitude - remLongitude)) * earthRadius);

Log.d("Distance after formula", String.valueOf(distance)); …
Run Code Online (Sandbox Code Playgroud)

java

1
推荐指数
1
解决办法
3709
查看次数

在Java中,按位不是双倍的

在Java中,按位非运算符(~)反转整数或长整数位.但为什么这不可能double?是否有任何使用此操作的方法double?我正在用Java编写自己的编程语言(这不是一个家庭作业),我相信应该包括双位的按位.

任何使用按位而不是双打的方法?

编辑:这不是如何对浮点数执行按位操作的重复,因为我使用Java而不是讨论过的C.我也知道使用语言的语法没有可能的方法,但是答案似乎把它投到了double一个int.我需要保持双倍的原样,而不是将其改为intlong.

编辑:按位不是我认为不会.它似乎*-1 - 1在输入上执行.因此,我的问题现在变成:

我希望将双精度变为二进制(请参阅我的另一个问题 ),将所有位(0到1和1到0)反转,然后将其转换回double.

java bits

1
推荐指数
1
解决办法
1951
查看次数

当我在Java中做除法时,我丢失了小数点,如何显示它?

当我这样做时

    double money = 2.3452;
    DecimalFormat decFor = new DecimalFormat("0.00");
    System.out.println(decFor.format(money));
Run Code Online (Sandbox Code Playgroud)

我得到这个输出:2.35

但是当我这样做时

    double money = 1/8;
    DecimalFormat decFor = new DecimalFormat("0.00");
    System.out.println(decFor.format(money));
Run Code Online (Sandbox Code Playgroud)

我得到:0.00

如何让Java显示0.12而不是0.00?

java

-2
推荐指数
1
解决办法
7057
查看次数