Java 计算双数据类型中不需要的部分
我对数据类型有一个奇怪的问题:double. 这是我的密码:Java 计算双数据类型中不需要的部分,java,double,Java,Double,我对数据类型有一个奇怪的问题:double. 这是我的密码: public class Example { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub double a = 1.0; for(int i =0; i<10;i++){
public class Example {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
double a = 1.0;
for(int i =0; i<10;i++){
System.out.println("Number => " + a );
a += 0.1;
}
}
}
但是,此代码示例的结果是:
Number => 1.0
Number => 1.1
Number => 1.2000000000000002
Number => 1.3000000000000003
Number => 1.4000000000000004
Number => 1.5000000000000004
Number => 1.6000000000000005
Number => 1.7000000000000006
Number => 1.8000000000000007
Number => 1.9000000000000008
我使用eclipse编译这个代码块。我在netbeans上试过,但没有任何改变
它应该如何发生?有什么想法吗
这并不容易。我会使用公共数学
for (int i = 0; i < 10; i++) {
a = Precision.round(a, 1); // <- round to 1 digit after decimal point
...
根据javadoc
如果数值运算符的操作数中至少有一个为double类型,则使用64位浮点运算执行该运算,数值运算符的结果为double类型的值。如果另一个操作数不是double,则首先通过数字升级(§5.6)将其加宽(§5.1.5)以键入double。
这只是精度问题。如果短小数的精确表示对您很重要,您应该使用BigDecimal,而不是double。Double是基于二进制分数的,对十及其幂没有特别的重要性。这是一种更通用的存储和处理大量数字的有用近似值的方法。我一直在寻找这种方法。几乎每个人都说bigDecimal是解决方案。但我只是想知道为什么会这样。顺便说一句,我的que是dup,我没有注意到其他问题。谢谢你的回答。当我使用小数字时,它非常有用。但我正在做一个关于计算金钱的项目。@alicanbatur不使用
Double
。使用BigDecimal
,请参阅然后使用BigDecimal,原始双精度对moneyes@SotiriosDelimanolis不好我现在正在使用BigDecimal。谢谢你的建议。
for (int i = 0; i < 10; i++) {
a = Precision.round(a, 1); // <- round to 1 digit after decimal point
...
a = Double.parseDouble(String.format(Locale.US, "%.1f", a));