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

Rud*_*dra 2 java floating-accuracy

这样做的时候

float d = (106108048) / (float)10;
Run Code Online (Sandbox Code Playgroud)

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

在黑客等级上,我解决了以下问题:你得到一个数字N,你需要打印数字正好除N的位置数.

输入:

1
106108048  
Run Code Online (Sandbox Code Playgroud)

结果:

5  
Run Code Online (Sandbox Code Playgroud)

我的解决方案

 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);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

TT.*_*TT. 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( ) );
  }
}
Run Code Online (Sandbox Code Playgroud)

这将打印出来:

10610804.8
Run Code Online (Sandbox Code Playgroud)

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

如果需要,可以通过构造MathContext对象来调整精度和RoundingMode.

最好MathContextdivide方法中传递参数以进行任意计算.如果精确商不具有终止十进制扩展,则除(bigDecimal divisor)方法将抛出一个ArithmeticException.