2011-04-05 63 views
2

我目前正在编写一个计算器应用程序。我知道,双打并不是最好的数学选择。应用程序中的大多数功能都具有很高的精度,但是没有得到超级难看的结果。我的解决方案是向用户显示精度只有12位小数。我选择了12,因为我的最低精度来自我的数值派生函数。在java中显示双精度到一定的精度

我遇到的问题是,如果我将它乘以一个缩放器然后再除以缩放器,那么精度将很可能会被丢失。如果我使用DecimalFormat,则无法仅显示12,并且使用E表示科学记数法正确显示,但如果不需要,则不会出现。

例如我想

1.23456789111213 to be 1.234567891112 

,但从来没有

1.234567891112E0 

但我也想

1.23456789111213E23 to be 1.234567891112E23 

所以基本上我想一个数字的字符串格式化12个小数位,保留科学记数法,但不应该科学,当它不应该

+0

看看你在做什么?快捷方式可能导致艰苦的工作!你知道double不是正确的选择,但是当你习惯了它时,你应该尝试克服double的问题,实际上,它应该学习如何使用BigDecimal(如所建议的!) – Frankie 2011-04-05 22:01:09

回答

3

使用String.format("%.12G", doubleVariable);

那你是怎么使用的格式()显示在科学记数法值,但没有科学记数法,如果没有必要的。一个需要注意的是,你最终有一个“+”的“E”之后,所以你最终会像1.234567891112E + 23

+0

谢谢,我很友善如果你不想显示为Justin Waugh – 2011-04-07 01:37:56

0
String.format("%.12d", doubleVariable); 

应该给你你第一件事要找的。我很抱歉,但我不知道如何定义何时显示您的电子通知。

1

我认为你正在寻找BigDecimal类。您可以使用toEngineeringString()方法来获取科学记数法。另见this answer。您还可以通过在其构造函数中指定MathContext来设置BigDecimal的精度,或者通过使用setScale()方法之一来指定比例。

0

你会感兴趣的BigDecimal,例如:

BigDecimal number = new BigDecimal("1.23456789111213"); 
number = number.setScale(12, RoundingMode.HALF_UP); 
System.out.println(number); 

选择适合你的RoundingMode。

+0

这对'1.23456789111213E23'有什么帮助吗? – 2011-04-06 07:27:50

+0

BigDecimal必须使用EngleeringString方法来帮助您使用这种表示法 - 但在此解决方案中,您应该决定是否要显示科学记数法 – smas 2011-04-06 08:15:17