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)
请改用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.
最好MathContext在divide方法中传递参数以进行任意计算.如果精确商不具有终止十进制扩展,则除(bigDecimal divisor)方法将抛出一个ArithmeticException.
| 归档时间: |
|
| 查看次数: |
1841 次 |
| 最近记录: |