class Why {
public static void main(String[] args) {
float a=7.5f;
float b=2.3f;
float m;
m=a%b;
System.out.println(m);
}
}编译后运行,输出结果是0.60000014,怎么有8位小数啊?!float数据类型不是最多保留7位小数的吗?就是写作m=(float)(a%b),结果还是这个数,这是怎么回事儿呢?还有,为什么结果不是0.6或者0.6000000,而是0.60000014呢?这是怎么计算的啊??
可惜忘了
学过计算机组成原理的应该都知道,它和整形数据在计算机中存储是完全不一样的。
当然,要想得到0.6这样的结果的话,应该使用到java中的一个类叫做:BigDecimal,程序改成这样:class Why {
public static void main(String[] args) {
BigDecimal a = new BigDecimal(7.5);
BigDecimal b = new BigDecimal(2.3);
float m = a.mod(b).floatValue();
System.out.println(m);
}
}
楼主可以运行一下这段代码
System.out.println (1.10 - 0.11);
你可能以为结果是0.99,
但实际上是0.9900000000000001,
不要惊讶,java中的浮点型就是这样不靠谱,
如果要精确计算请用java.math.BigDecimal,
可惜BigDecimal没有取模运算,
BigInteger可以,可惜是整数
我说兄弟啊,BigDecimal可没有取模,那是BigInteger,别误导了楼主
* 根据指定的小数位数返回浮点数字符串,末尾4舍5入
* @param f float 浮点数
* @param m 小数位数
* @return String 结果字符串
*/
public static String reservationsPonit(double f,int m){
java.text.DecimalFormat format = (java.text.DecimalFormat)java.text.DecimalFormat.getInstance();
String str="";
for(int i=0;i<m;i++){
str+="#";
}
format.applyPattern("####."+str);
return format.format(f);
}
public static void main(String args[]){
float a=7.5f;
float b=2.3f;
float m;
int ai = (int)( a * 10 );
int bi = (int)( b * 10 );
int mi ;
mi = ai % bi;
m = (float)mi / 10 ;
System.out.println(m);
}
想限定结果位数的话,像14楼的那样用DecimalFormat,然后format.applyPattern("##.##"),只所以需要强制转型,是因为DecimalFormat.getInstance()返回的是NumberFormat,NumberFormat是DecimalFormat的父类。那为什么不用NumberFormat呢,你看看这篇文章http://www.blogjava.net/tomato2088/archive/2006/12/14/87731.html