如何保留两位小数

等等,还有一个bug 2019-04-27 05:47:19
#include<stdio.h>
int main()
{
float b = 2345.23456;
b=int(b*100)/100.0;
printf("%f", b);
return 0;
}
为何我后面精度有问题,请问有人知道怎么解决吗?
...全文
346 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 13 楼 老马何以识途 的回复:
如果你要存儲,那就改用自定義結構來表示,比如兩個整數分別表示整數部分和小數部分。 輸出的話,樓上的格式化輸出就能搞定。
哦哦,了解了,谢谢
老马何以识途 2019-04-29
  • 打赏
  • 举报
回复
如果你要存儲,那就改用自定義結構來表示,比如兩個整數分別表示整數部分和小數部分。 輸出的話,樓上的格式化輸出就能搞定。
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <string.h>

int main(int argc, char * argv[])
{
char buf[32] = "";
int i,len;
float b = 2345.23456;

sprintf(buf, "%f", b);
i = strlen(buf);
while(buf[i-2] != '.')
buf[i--] = '0';
printf("%s",buf);

return 0;
}
  • 打赏
  • 举报
回复
引用 10 楼 拥抱Linux 的回复:
[quote=引用 9 楼 等等,还有一个bug 的回复:] 那有没有其它办法可以解决呢?换一种方法来实现
也许可以抖个机灵:

	b = (int)(b * 100) / 100.0;
	printf("%.2f0000", b);
[/quote]这个我觉得完全OK
拥抱Linux 2019-04-27
  • 打赏
  • 举报
回复
引用 9 楼 等等,还有一个bug 的回复:
那有没有其它办法可以解决呢?换一种方法来实现


也许可以抖个机灵:

b = (int)(b * 100) / 100.0;
printf("%.2f0000", b);

  • 打赏
  • 举报
回复
引用 8 楼 拥抱Linux 的回复:
[quote=引用 6 楼 等等,还有一个bug 的回复:] [quote=引用 4 楼 拥抱Linux 的回复:] [quote=引用 3 楼 等等,还有一个bug 的回复:] [quote=引用 2 楼 拥抱Linux 的回复:]
b=(int)(b*100)/100.0;
printf("%.2f", b);
我的目的是将保留两位有效数字存起来,这样做为什么显示不是两位有效数字呢[/quote] 看不懂你这半句话。直接用上面的数字来举例,说说你想要的结果是什么样子吧?[/quote]我的意思是这样运算以后,为什么b值不是2345.230000而是2345.229980[/quote] 因为计算机里的(float或double)浮点数绝大部分只是一个近似值,不是所有的数学上的小数都能用(float / double)浮点数来「精确」表示。根源是(float或double)浮点数的字节数有限,而很明显数学上的小数可以说是无限的。以有限表示无限,殆矣。[/quote]那有没有其它办法可以解决呢?换一种方法来实现
拥抱Linux 2019-04-27
  • 打赏
  • 举报
回复
引用 6 楼 等等,还有一个bug 的回复:
[quote=引用 4 楼 拥抱Linux 的回复:]
[quote=引用 3 楼 等等,还有一个bug 的回复:]
[quote=引用 2 楼 拥抱Linux 的回复:]
b=(int)(b*100)/100.0;
printf("%.2f", b);
我的目的是将保留两位有效数字存起来,这样做为什么显示不是两位有效数字呢[/quote]
看不懂你这半句话。直接用上面的数字来举例,说说你想要的结果是什么样子吧?[/quote]我的意思是这样运算以后,为什么b值不是2345.230000而是2345.229980[/quote]
因为计算机里的(float或double)浮点数绝大部分只是一个近似值,不是所有的数学上的小数都能用(float / double)浮点数来「精确」表示。根源是(float或double)浮点数的字节数有限,而很明显数学上的小数可以说是无限的。以有限表示无限,殆矣。
おしまい。 2019-04-27
  • 打赏
  • 举报
回复
float的精度这里应该不够了,建议你用double试一下。输出的时候 printf(%.2lf,b)应该就可以。
  • 打赏
  • 举报
回复
引用 4 楼 拥抱Linux 的回复:
[quote=引用 3 楼 等等,还有一个bug 的回复:] [quote=引用 2 楼 拥抱Linux 的回复:]
b=(int)(b*100)/100.0;
printf("%.2f", b);
我的目的是将保留两位有效数字存起来,这样做为什么显示不是两位有效数字呢[/quote] 看不懂你这半句话。直接用上面的数字来举例,说说你想要的结果是什么样子吧?[/quote]我的意思是这样运算以后,为什么b值不是2345.230000而是2345.229980
  • 打赏
  • 举报
回复
引用 4 楼 拥抱Linux 的回复:
[quote=引用 3 楼 等等,还有一个bug 的回复:] [quote=引用 2 楼 拥抱Linux 的回复:]
b=(int)(b*100)/100.0;
printf("%.2f", b);
我的目的是将保留两位有效数字存起来,这样做为什么显示不是两位有效数字呢[/quote] 看不懂你这半句话。直接用上面的数字来举例,说说你想要的结果是什么样子吧?[/quote]2345.230000
拥抱Linux 2019-04-27
  • 打赏
  • 举报
回复
引用 3 楼 等等,还有一个bug 的回复:
[quote=引用 2 楼 拥抱Linux 的回复:]
b=(int)(b*100)/100.0;
printf("%.2f", b);
我的目的是将保留两位有效数字存起来,这样做为什么显示不是两位有效数字呢[/quote]
看不懂你这半句话。直接用上面的数字来举例,说说你想要的结果是什么样子吧?
  • 打赏
  • 举报
回复
引用 2 楼 拥抱Linux 的回复:
b=(int)(b*100)/100.0;
printf("%.2f", b);
我的目的是将保留两位有效数字存起来,这样做为什么显示不是两位有效数字呢
拥抱Linux 2019-04-27
  • 打赏
  • 举报
回复
b=(int)(b*100)/100.0;
printf("%.2f", b);
  • 打赏
  • 举报
回复

69,372

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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