可能重复:
如何在Java 0.1F 0.1F增量和1.0F之间的重复?
我的计划的一部分,需要使用while循环内的值:
0.1
0.2
0.3
...
0.9
所以我需要为他们提供的是内循环。 下面是代码:
double x = 0.0;
while ( x<=1 )
{
// increment x by 0.1 for each iteration
x += 0.1;
}
我需要的输出必须准确:
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
但它实际上给了我这样的:
0.1
0.2
0.300000000000000000000000004
0.4
0.5
0.6
0.79999999999999999999999999
0.89999999999999999999999999
0.99999999999999999999999999
欢迎到浮点,其中0.1是不是0.1的世界。 的问题是,许多号码,包括0.1,不能精确地表示一个double
。 那么,你是不是真的准确添加0.1〜 x
通过每一次循环中。
一种方法是通过10使用整数运算和除法:
int i = 0;
while (i <= 10) {
double x = i / 10.0;
. . .
i++;
}
另一种方法是让x
一BigDecimal
,在那里你可以指定你想要一个特定的精度。 它基本上是做什么的上述循环做(再加上规模的整数),但在一个不错的类,有很多花俏的包装起来。 哦,它具有任意精度。
为了得到你想要的输出,你可以使用DecimalFormat
。 下面是一些示例代码。
import java.text.DecimalFormat;
public class DF {
public static void main(String [] args) {
double x = 0.1;
DecimalFormat form = new DecimalFormat("#.#");
while (x <= .9) {
System.out.println(Double.valueOf(form.format(x)));
x += 0.1;
}
}
}
至于你现在的执行情况,也不能保证,以什么会打印由于浮点数的性质的精度。
使用的BigDecimal
double x = 0.0;
int decimalPlaces = 2;
while ( x<=1 )
{
x += 0.1;
BigDecimal bd = new BigDecimal(x);
bd = bd.setScale(decimalPlaces, BigDecimal.ROUND_HALF_UP);
x = bd.doubleValue();
System.out.println(x);
}
你需要使用十进制格式,以获得预期的输出。
下面是用于生成所期望的输出的代码:
import java.text.DecimalFormat;
public class FloatIncrement {
public static void main (String args[]){
double x= 0.0;
DecimalFormat form = new DecimalFormat("#.#");
while(x<0.9){
x= x+0.1;
System.out.println("X : "+Double.valueOf(form.format(x)));
}
}
}
那是因为你可以使用二进制浮点做精确的小数点算术因为FP不能精确代表所有十进制值。
您需要使用一个整数值表示像几或千分之一些十进制小数单位或使用类似的BigDecimal。
双存储二进制
浮起并双存储数字作为一定数目的显著数字和小数点(有点像科学记数法)。 该显著数字部分总是不完美的,因为它存储了一定量的二进制数 - 所以你不能指望它来执行你期待它的方式。 (对于一个更好的解释看http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html )
考虑使用一个类如BigDecimal的或实现有理数类,喜欢这里提到的那些- 有没有在Java中常用的有理数库?
你也可以只是把我变成一个整数,并将其更改从1到10,并在代码中弥补这一点。