Java 带余数的减法vs转换为int以更改双精度

Java 带余数的减法vs转换为int以更改双精度,java,double,precision,Java,Double,Precision,我有一个doubled,我想把它变成一个小数有限的double(l) 哪种代码“更好” 我还希望能够使用此选项仅允许半个数字(例如9.5612->9.5)。您可以使用: 将打印: 81.23 您可以使用: 将打印: 81.23 您可以使用: 将打印: 81.23 您可以使用: 将打印: 81.23 这两种解决方案都是可以接受的。然而,这是一个有趣的问题,所以我尝试使用以下代码计算处理时间: double d = 81.2384; double l1 = 0, l2 = 0

我有一个double
d
,我想把它变成一个小数有限的double(
l

哪种代码“更好”

我还希望能够使用此选项仅允许半个数字(例如
9.5612->9.5
)。

您可以使用:

将打印:

81.23
您可以使用:

将打印:

81.23
您可以使用:

将打印:

81.23
您可以使用:

将打印:

81.23

这两种解决方案都是可以接受的。然而,这是一个有趣的问题,所以我尝试使用以下代码计算处理时间:

    double d = 81.2384;
    double l1 = 0, l2 = 0;
    Long start = System.nanoTime();

    for (int i = 0; i < 1000 * 1000 * 100; i++) {
        l1 = d - d % 0.1;
    }
    Long time = System.nanoTime();
    Long l1speed = time - start;
    for (int i = 0; i < 1000 * 1000 * 100; i++) {
        l2 = (int) (d * 10) * 0.1;
    }
    Long l2speed = System.nanoTime() - time;

    System.out.println(l1 + l2); //to be sure that compiler does not ignore l1, l2
    System.out.println("computing l1 runs :" + ((double)l1speed / l2speed)+"faster than computing l2");

这两种解决方案都是可以接受的。然而,这是一个有趣的问题,所以我尝试使用以下代码计算处理时间:

    double d = 81.2384;
    double l1 = 0, l2 = 0;
    Long start = System.nanoTime();

    for (int i = 0; i < 1000 * 1000 * 100; i++) {
        l1 = d - d % 0.1;
    }
    Long time = System.nanoTime();
    Long l1speed = time - start;
    for (int i = 0; i < 1000 * 1000 * 100; i++) {
        l2 = (int) (d * 10) * 0.1;
    }
    Long l2speed = System.nanoTime() - time;

    System.out.println(l1 + l2); //to be sure that compiler does not ignore l1, l2
    System.out.println("computing l1 runs :" + ((double)l1speed / l2speed)+"faster than computing l2");

这两种解决方案都是可以接受的。然而,这是一个有趣的问题,所以我尝试使用以下代码计算处理时间:

    double d = 81.2384;
    double l1 = 0, l2 = 0;
    Long start = System.nanoTime();

    for (int i = 0; i < 1000 * 1000 * 100; i++) {
        l1 = d - d % 0.1;
    }
    Long time = System.nanoTime();
    Long l1speed = time - start;
    for (int i = 0; i < 1000 * 1000 * 100; i++) {
        l2 = (int) (d * 10) * 0.1;
    }
    Long l2speed = System.nanoTime() - time;

    System.out.println(l1 + l2); //to be sure that compiler does not ignore l1, l2
    System.out.println("computing l1 runs :" + ((double)l1speed / l2speed)+"faster than computing l2");

这两种解决方案都是可以接受的。然而,这是一个有趣的问题,所以我尝试使用以下代码计算处理时间:

    double d = 81.2384;
    double l1 = 0, l2 = 0;
    Long start = System.nanoTime();

    for (int i = 0; i < 1000 * 1000 * 100; i++) {
        l1 = d - d % 0.1;
    }
    Long time = System.nanoTime();
    Long l1speed = time - start;
    for (int i = 0; i < 1000 * 1000 * 100; i++) {
        l2 = (int) (d * 10) * 0.1;
    }
    Long l2speed = System.nanoTime() - time;

    System.out.println(l1 + l2); //to be sure that compiler does not ignore l1, l2
    System.out.println("computing l1 runs :" + ((double)l1speed / l2speed)+"faster than computing l2");


如果您试图以有限的位数输出它,请选中此选项,编辑数字本身的值是错误的方法(而且可能无论如何都不起作用)。使用类似kocko建议的字符串格式类。@塔尔文我使用该类读取只能以特定精度处理的值。您无法可靠地将二进制浮点数(Java中的float/double)四舍五入为十进制小数位数的精确数字。你可以在许多问答中了解到这一点,比如:(为什么十进制数不能用二进制表示?@ErwinBolwidt这是真的,但你可以可靠地将二进制浮点数“四舍五入”到一半的精度,这就是我想要的。如果你想用有限的位数输出它,请检查这个,编辑数字本身的值是一种错误的方式(而且可能无论如何都不起作用)。使用类似kocko建议的字符串格式类。@塔尔文我使用该类读取只能以特定精度处理的值。您无法可靠地将二进制浮点数(Java中的float/double)四舍五入为十进制小数位数的精确数字。你可以在许多问答中了解到这一点,比如:(为什么十进制数不能用二进制表示?@ErwinBolwidt这是真的,但你可以可靠地将二进制浮点数“四舍五入”到一半的精度,这就是我想要的。如果你想用有限的位数输出它,请检查这个,编辑数字本身的值是一种错误的方式(而且可能无论如何都不起作用)。使用类似kocko建议的字符串格式类。@塔尔文我使用该类读取只能以特定精度处理的值。您无法可靠地将二进制浮点数(Java中的float/double)四舍五入为十进制小数位数的精确数字。你可以在许多问答中了解到这一点,比如:(为什么十进制数不能用二进制表示?@ErwinBolwidt这是真的,但你可以可靠地将二进制浮点数“四舍五入”到一半的精度,这就是我想要的。如果你想用有限的位数输出它,请检查这个,编辑数字本身的值是一种错误的方式(而且可能无论如何都不起作用)。使用类似kocko建议的字符串格式类。@塔尔文我使用该类读取只能以特定精度处理的值。您无法可靠地将二进制浮点数(Java中的float/double)四舍五入为十进制小数位数的精确数字。你可以在许多问答中了解到这一点,比如:(为什么十进制数不能用二进制表示?@ErwinBolwidt这是真的,但你可以可靠地将二进制浮点数“四舍五入”到一半的精度,这就是我想要的。你的代码在打印数字时很有用,但我想读取数字,并以一定的精度处理它们
DecimalFormat.format()
返回一个字符串。您可以使用:
double.valueOf(String s)
将返回的
字符串
转换为
double
,但当您可以使用简单的除法时,将其转换为字符串并返回有什么意义?另外,您不能使用DecimalFormat指定对半的精度,对吗?您的代码在打印数字时很有用,但我希望读取数字并以一定的精度处理它们
DecimalFormat.format()
返回一个字符串。您可以使用:
double.valueOf(String s)
将返回的
字符串
转换为
double
,但当您可以使用简单的除法时,将其转换为字符串并返回有什么意义?另外,您不能使用DecimalFormat指定对半的精度,对吗?您的代码在打印数字时很有用,但我希望读取数字并以一定的精度处理它们
DecimalFormat.format()
返回一个字符串。您可以使用:
double.valueOf(String s)
将返回的
字符串
转换为
double
,但当您可以使用简单的除法时,将其转换为字符串并返回有什么意义?另外,您不能使用DecimalFormat指定对半的精度,对吗?您的代码在打印数字时很有用,但我希望读取数字并以一定的精度处理它们
DecimalFormat.format()
返回一个字符串。您可以使用:
double.valueOf(String s)
将返回的
字符串
转换为
double
,但当您可以使用简单的除法时,将其转换为字符串并返回有什么意义?此外,您无法使用DecimalFormat指定半精度,对吗?请注意,第二种方法将导致任何大于最大值1/10的双精度值出现整数溢出