如何获得超过9位的精确小数除法?

时间:2014-08-29 14:29:55

标签: java floating-accuracy

这样做

float d = (106108048) / (float)10;

输出为1.0610805E7,但我需要 10610804.8 。这样做的正确方法是什么?

在Hacker Rank上,我解决了以下问题:你得到一个数字N,你需要打印数字正好除N的位置数。

输入:

1
106108048  

结果:

5  

我的解决方案:

 import java.io.*;
 import java.util.*;
 import java.math.*;


    public class Solution{

        public static void main(String[] args){
            Scanner sc = new Scanner(System.in);
            int p = 0;
            boolean check = true;
            while(sc.hasNext()){
                if(check){
                    check= false;
                    sc.next();
                }
                Integer number = sc.nextInt();
                String snumner = number.toString();
                int q = 1;
                int j = 0;
                for(int i = 0 ; i< snumner.length();i++ ){
                            q = q *10;
                            p = q;
                   System.out.println("p:"+p)
                   System.out.println("number:"+number);
                    float d = (number)/(float)p;//problem is here
                    System.out.println("ddd:"+d);
                    String ss = String.valueOf(d);
                    System.out.println("SS:"+ss);
                    int index = ss.indexOf('.');
                    System.out.println("in"+index);
                    System.out.println("VV"+ss.charAt(index+1));
                    String newn = " " + ss.charAt(index+1);
                    int sss= Integer.parseInt(newn.trim());
                   System.out.println("SSS"+sss);
                    if(sss != 0){
                    if(number%sss ==0){
                        j++;
                     }
                    }
                }
                System.out.println("no:"+j);
            }
        }
    }

6 个答案:

答案 0 :(得分:5)

使用java的BigDecimal代替。该类专为定点算术而设计,可提供更高的精度。

引用BigDecimal上的文档:

  

不可变,任意精度的带符号十进制数。 BigDecimal由任意精度整数非标度值和32位整数标度组成。

一个例子:

import java.math.BigDecimal;
import java.math.MathContext;

public class BigDecimalExample{
  public static void main(String[] args) {
    BigDecimal dividend = BigDecimal.valueOf( 106108048 );
    BigDecimal divisor = BigDecimal.valueOf( 10 );
    BigDecimal result = dividend.divide( divisor, MathContext.DECIMAL64 );
    System.out.println( result.toPlainString( ) );
  }
}

这将打印出来:

10610804.8

请注意,此示例使用MathContext.DECIMAL64作为将精度和舍入模式传递给divide方法的方法。这将设置与IEEE 754R Decimal64格式(16位数)匹配的精度和舍入模式,以及HALF_EVEN的舍入模式,IEEE 754R默认值。

如果需要,您可以按RoundingMode调整精度和constructing a MathContext object

最好在MathContext方法中传递divide参数以进行任意计算。如果确切的商没有终止十进制扩展,divide(BigDecimal divisor)方法将抛出ArithmeticException

答案 1 :(得分:2)

使用double

PS:无论如何,浮点都不准确。

答案 2 :(得分:2)

使用double提高精确度。如果不够,请使用BigDecimal。在你的情况下:

double d = 106108048d / 10d;

答案 3 :(得分:2)

您可以使用DecimalFormat执行此操作。但是,另一个更好的选择是使用BigDecimal,它提供了开箱即用的方法:

BigDecimal value = BigDecimal.valueOf(106108048).divide(BigDecimal.valueOf(10));
System.out.println(value.toPlainString());

请注意,鉴于BigDecimal类具有任意精度,您可能会在那里获得长字符串。您也可以根据自己的需要进行解决。

答案 4 :(得分:1)

这将有效:

import java.text.DecimalFormat;

public class Test {
public static void main(String[] args) {
    double d = (106108048) / (double)10;
    System.out.println(d);
    System.out.println(new DecimalFormat("#.#").format(d));
}
}

答案 5 :(得分:0)

如果您的最终目标是将值写为/显示为String,请最后使用函数String.format