java的浮点数运算与小数位数问题

gthboy 2009-02-16 09:40:06

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呢?这是怎么计算的啊??
...全文
859 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
gthboy 2009-03-13
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 Arc365 的回复:]
引用 4 楼 ymmc001 的回复:
这些都不要觉得奇怪哦,因为浮点数(float类型数据)在计算机中真正的表示方式是按照IEEE标准存储的。
学过计算机组成原理的应该都知道,它和整形数据在计算机中存储是完全不一样的。
当然,要想得到0.6这样的结果的话,应该使用到java中的一个类叫做:BigDecimal,程序改成这样:

Java code
class Why {
public static void main(String[] args) {
BigDecimal a = new Bi…
[/Quote]

你咋没看到6楼啊?
Arc365 2009-03-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ymmc001 的回复:]
这些都不要觉得奇怪哦,因为浮点数(float类型数据)在计算机中真正的表示方式是按照IEEE标准存储的。
学过计算机组成原理的应该都知道,它和整形数据在计算机中存储是完全不一样的。
当然,要想得到0.6这样的结果的话,应该使用到java中的一个类叫做:BigDecimal,程序改成这样:

Java code
class Why {
public static void main(String[] args) {
BigDecimal a = new BigDecimal(7.5);
BigDec…
[/Quote]

此楼正解
gthboy 2009-03-12
  • 打赏
  • 举报
回复
每天一顶~~~
gthboy 2009-03-10
  • 打赏
  • 举报
回复
继续顶~~
second_dream 2009-03-10
  • 打赏
  • 举报
回复
再顶~~~~~~
gthboy 2009-03-08
  • 打赏
  • 举报
回复
再顶~~~~~~~~~
gthboy 2009-03-07
  • 打赏
  • 举报
回复
我再顶~~~
second_dream 2009-03-06
  • 打赏
  • 举报
回复
顶一下~~~
gthboy 2009-03-03
  • 打赏
  • 举报
回复
我还顶
gthboy 2009-03-02
  • 打赏
  • 举报
回复
再顶顶~~
gthboy 2009-03-01
  • 打赏
  • 举报
回复
我想知道的是,遇上这样的计算要求应该怎么处理呢??
凌霄野鹤 2009-03-01
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 gthboy 的回复:]
引用 14 楼 kj_zx19854 的回复:
不知道楼主对我这个感兴趣不?

Java code
/**
* 根据指定的小数位数返回浮点数字符串,末尾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…
[/Quote]


你写个测试的就知道是怎么回事了!注释很清楚啊。
nonopo 2009-03-01
  • 打赏
  • 举报
回复
java的浮点数运算确实不精确,我也不明白。第一次我也想到用BigDecimal,但BigDecimal没有取余的方法.所以,把浮点数转换为整数再运算,再把结果还原成浮点数.
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
gthboy 2009-03-01
  • 打赏
  • 举报
回复
顶个明白~~~
gthboy 2009-02-28
  • 打赏
  • 举报
回复
顶一顶吧!
gthboy 2009-02-27
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 kj_zx19854 的回复:]
不知道楼主对我这个感兴趣不?

Java code
/**
* 根据指定的小数位数返回浮点数字符串,末尾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="";

[/Quote]

惭愧,这个的用途是……?
lc328 2009-02-26
  • 打赏
  • 举报
回复
浮点数运算,会产生近似值,
小数位转换为二进制时出现的问题。。
小数转二进制是*2取整部份。一直到没有小数位为止。
凌霄野鹤 2009-02-26
  • 打赏
  • 举报
回复
不知道楼主对我这个感兴趣不?

/**
* 根据指定的小数位数返回浮点数字符串,末尾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);
}
second_dream 2009-02-26
  • 打赏
  • 举报
回复
难道大家对这个问题不感兴趣??
gthboy 2009-02-23
  • 打赏
  • 举报
回复
再顶顶!!
加载更多回复(11)

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧