public class Test
{
public static void main(String[] args)
{
float a = 0.083f;
System.out.println("a = " + a);
System.out.println("a*100 = " + a*100);
float b = 0.084f;
System.out.println("b = " + b);
System.out.println("b*100 = " + b*100);
}
}大家看看结果是什么?
a*100 = 8.299999
b = 0.084
b*100 = 8.4不足为怪,float型就是不精确的小数
你试试class Test {
public static void main(String[] args) {
float f=1.05f;
System.out.println(100*f);
}
}
浮点型永远不会精确
public static void main(String args[]) throws Exception {
float a = 0.083f;
System.out.printf("a = %12.9f\n" , a);
System.out.printf("a*100 = %12.9f\n" , a*100);
float b = 0.084f;
System.out.printf("b = %12.9f\n", b);
System.out.printf("b*100 = %12.9f\n" ,b*100);
}输出如下:
F:\java>java Test
a = 0.082999997
a*100 = 8.299999237
b = 0.083999999
b*100 = 8.399999619如果有效数字少,四舍五入之后,后面全是0,就不输出了,所以输出是0.083之类的你以为是精确的了,其实不然。也不是所有的浮点数都没有办法精确表示。应该是不能精确转为二进制小数的浮点数,没有办法精确表示。
比如0.5、0.25、0.125、0.0625...(分别是2^-1、2^-2、2^-3...)等之类的小数(以及由它们的和组成的小数,如0.75)是可以精确表示的。
float a = 0.083f;
System.out.println("a = " + a);
System.out.println("a*100 = " + a*100);把其的System.out.println("a*100 = " + a*100);改成
System.out.println("a*100 = " + a*1000/10);居然结果又变成8.3了(java下)但C#下却不会。