这样做
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);
}
}
}
答案 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
。