Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.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双精度减少到n个有效数字?_Java_Decimal_Bigdecimal_Decimalformat_Rounding Error - Fatal编程技术网

如何将java双精度减少到n个有效数字?

如何将java双精度减少到n个有效数字?,java,decimal,bigdecimal,decimalformat,rounding-error,Java,Decimal,Bigdecimal,Decimalformat,Rounding Error,我希望打印小数字(双精度),以便使用Newton和割线方法打印错误 我的一个错误是5.43330616802499E-5 我想打印5.4333E-5 我曾想过使用BigDecimal,但我不熟悉这个类 双d=5.43330616802499E-5; BigDecimal dc=新的BigDecimal(d); dc=dc.round(新的MathContext(3));//所需有效数字 双舍入=dc.doubleValue()双d=5.43330616802499E-5; BigDecimal

我希望打印小数字(
双精度
),以便使用
Newton
割线
方法打印错误

我的一个错误是
5.43330616802499E-5

我想打印
5.4333E-5


我曾想过使用
BigDecimal
,但我不熟悉这个类

双d=5.43330616802499E-5; BigDecimal dc=新的BigDecimal(d); dc=dc.round(新的MathContext(3));//所需有效数字
双舍入=dc.doubleValue()
双d=5.43330616802499E-5;
BigDecimal dc=新的BigDecimal(d);
dc=dc.round(新的MathContext(3));//所需有效数字
双舍入=dc.doubleValue()

我想打印小数字(双倍)

结果:
5.4333e-05

注意:它不会降低原始值的精度,只是以较低的精度打印

我想打印小数字(双倍)

结果:
5.4333e-05


注意:它不会降低原始值的精度,只是以较低的精度打印。

您确实可以使用BigDecimal,它将如下所示:

BigDecimal d = BigDecimal.valueOf(val).setScale(scale, RoundingMode.HALF_UP);
double scaled = d.doubleValue();
或者您可以使用:

Math.round(val*Math.pow(10, scale))/Math.pow(10, scale);

您确实可以使用BigDecimal,它将如下所示:

BigDecimal d = BigDecimal.valueOf(val).setScale(scale, RoundingMode.HALF_UP);
double scaled = d.doubleValue();
或者您可以使用:

Math.round(val*Math.pow(10, scale))/Math.pow(10, scale);

要回答一般问题,而不仅仅是使用
System.out.printf
打印的情况,请执行以下操作:

您可以使用
f
字符串插值器或格式化方法

val a: Double = 5.433306166802499E-5
val reduced1: Double = f"$a%1.4e".toDouble
val reduced2: Double = "%1.4e".format(a).toDouble

两者都是相等的:
5.4333e-05

回答一般问题,而不仅仅是使用
System.out.printf打印的情况:

您可以使用
f
字符串插值器或格式化方法

val a: Double = 5.433306166802499E-5
val reduced1: Double = f"$a%1.4e".toDouble
val reduced2: Double = "%1.4e".format(a).toDouble

两者都是相等的:
5.4333e-05

您只需要格式化数字以便打印。不要乱动数值(即不要“减少到n位数”)。@ScaryWombat不同意。他只是想为输出设置一个双精度格式。@JimGarrison好的,看起来我在标题上放得太重了。你只是想设置数字格式以便打印。不要乱动数值(即不要“减少到n位数”)。@ScaryWombat不同意。他只是想为输出设置一个双精度格式。@JimGarrison好的,看起来我在标题上放得太重了。你漏掉了“e”格式说明符;我添加它是为了让你的答案真正起作用。@JimGarrison谢谢,我不知道我是如何丢失了
e
你遗漏了“e”格式说明符的;我添加它是为了让你的答案真正起作用。@JimGarrison谢谢,我不知道我是如何丢失了
e
第一个例子,因为逗号太多,如果
val=5.43330616802499e-5
,结果是
1.0E-4
,这与
5.4333E-5
的预期输出相差很远。第一个例子是因为逗号太多,如果问题中给出的
val=5.43330616802499e-5
,则结果为
1.0E-4
,这与
5.4333E-5
的预期输出相差甚远。