Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.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 计算双数据类型中不需要的部分_Java_Double - Fatal编程技术网

Java 计算双数据类型中不需要的部分

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++){

我对数据类型有一个奇怪的问题: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++){
            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));