怎样把浮点数正确地转换为整数

pango99 2003-03-28 05:39:24
我发现VC中对浮点数的类型转化好象有点问题,请看如下程序:

double d1=1.16;
double d2=d1*25.0;//d2为29
int i=(int)d2;

i的正确结果应该为29,可程序的结果是28,象这样的错误在很多地方还存在,有谁知道该如何解决吗?
...全文
1395 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Uleodot 2003-09-24
  • 打赏
  • 举报
回复
最简单的就是
int i = (int)d2 + 1;
lmtz007yan 2003-09-24
  • 打赏
  • 举报
回复
In355Hz(好象一条狗) 朋友说的对又考虑全面!
这是常用而且好用的一种四舍五入的方法!
赞同!
推荐!
祝你进步|!
lyzcom 2003-09-24
  • 打赏
  • 举报
回复
楼上的好象说反了吧?floor是取小于他的最大整数,ceil是大于它的最小整数。
jimware 2003-03-28
  • 打赏
  • 举报
回复
你参考一下math.h 中的 floor 和 ceil 函数,一个是取大于它的最小整数,一个是取小于它的最大整数
eion 2003-03-28
  • 打赏
  • 举报
回复
自己做一个“有理数”类,然后再用自己的有理数类来编写代码。

为什么会出现错误?
因为1.16没法完全正确的在计算机上表示(用二进制永远无法表示出1.16),所以就出现了截断溢出,表示的值就只能比1.16小。它再跟25相乘,于是结果就比29稍微小一点。

解决:
一般你在结果后加一个小小的epsilon来调整,如
#define epsilon 0.000000001
于是你定义一个转换函数
int f2n(double d)
{
return int(d+epsilon);
}
当然,如果是负数有可能是-epsilon,到底是加是减,自己作试验再说
rtdb 2003-03-28
  • 打赏
  • 举报
回复
哟,In355Hz(好象一条狗) 的对,
连负数都想到了。

xt_jat 2003-03-28
  • 打赏
  • 举报
回复
int i = d2 + 0.001 ;
rtdb 2003-03-28
  • 打赏
  • 举报
回复
int i=(int)d2;
当你用int强制转化时, 它是用截断。
所以28.99999999就会变为28.

可改为:
int i=(int)(d2+0.5);
就会四舍五入了。


In355Hz 2003-03-28
  • 打赏
  • 举报
回复
因为误差,计算的结果可能是 28.99.. 转化为 int 的时候去尾成为了 28,可以利用4舍5入:

int i = (d2 > 0) (d2 + 0.50) : (d2 - 0.50);
guoxiny 2003-03-28
  • 打赏
  • 举报
回复
warning C4244: 'initializing' : conversion from 'double' to 'int', possible loss of data

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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