double转成int的问题

时间:2022-08-02 16:06:36
比如一个数2.55
int a;
a = (int)(2.55 * 100);
最后a = 254。

有什么比较好的方法准确输出??

30 个解决方案

#1


四舍五入则取小数部分判断下,超过的话取上整ceil,否则下整floor

#2


你最后要输出255吗?

#3


要看你怎么定义“准确”了
2.55本身就无法准确输出,谁也不会知道你到底哪个值是准确的
实际上,2.55和2.499999在你这个问题上是等价的,因为你取整本身就是使结果更不准确的过程
你的取整的截断误差本来就是0.01这么大的,得到254、255正好是误差范围内,这在物理和编程范围内它都是准确的

引用楼主 novice2008 的帖子:
比如一个数2.55 
int a; 
a = (int)(2.55 * 100); 
最后a = 254。 

有什么比较好的方法准确输出??

#4


printf("%d\n",int(2.5500000001*100.0));

#5


引用 2 楼 topwork 的回复:
你最后要输出255吗?

是阿,我是想输出255

#6


引用 4 楼 fibbery 的回复:
printf("%d\n",int(2.5500000001*100.0));


是个好方法

#7


引用 3 楼 arong1234 的回复:
要看你怎么定义“准确”了 
2.55本身就无法准确输出,谁也不会知道你到底哪个值是准确的 
实际上,2.55和2.499999在你这个问题上是等价的,因为你取整本身就是使结果更不准确的过程 
你的取整的截断误差本来就是0.01这么大的,得到254、255正好是误差范围内,这在物理和编程范围内它都是准确的 

引用楼主 novice2008 的帖子:
比如一个数2.55 
int a; 
a = (int)(2.55 * 100); 
最后a = 254。 

有什么比较好的方法准…


#include <iostream>
int main(int argc,char* argv[])
{
printf("%d\n",int(2.5500000001*100.0));
printf("%f\n",2.55*100);
printf("%f\n",2.55);
return 0;
}

E:\MyDocs\debug>test
255
255.000000
2.550000

#8


这么写:

int a = 2.55 * 1000 / 10;

#9


没有任何意义
引用 8 楼 topwork 的回复:
这么写: 

C/C++ code
int a = 2.55 * 1000 / 10;

#10


如果想输出255,你还不如直接printf("255\n")呢
我觉得楼主首先要更正自己的观念,为什么254就不准确了?你的截断误差上限就是1,254,255,256都应该是绝对准确的

#11


能输出255当然直接255

只是数据是2.55
而我必须处理成255才能做

引用 10 楼 arong1234 的回复:
如果想输出255,你还不如直接printf("255\n")呢 
我觉得楼主首先要更正自己的观念,为什么254就不准确了?你的截断误差上限就是1,254,255,256都应该是绝对准确的 

#12


通过字符串转换。
这样写 就可以了。我试过的,可以准确输出。

double x=2.55,y;
char ch[20];
int b,c;
y=x*100;
sprintf(ch,"%01f",y);
c=atol(ch);
cout << "x=" << c << "y=" << y << endl;
cin >> b ;

#13


2.55000000000000000
和2.549999999999999
如你所说,差别当然不大
进行运算结果也无差别。

但是一截断后差别能不大吗?
别说255,254
2.55和2.549也差很多了吧
引用 10 楼 arong1234 的回复:
如果想输出255,你还不如直接printf("255\n")呢 
我觉得楼主首先要更正自己的观念,为什么254就不准确了?你的截断误差上限就是1,254,255,256都应该是绝对准确的 

#14


也许你只是想四舍五入,但是你这种描述还是不科学的。不过不管你了,反正你也不懂你的数据是255,但是输出254/256再数学、物理和科学界都是准确的。

引用 11 楼 novice2008 的回复:
能输出255当然直接255 

只是数据是2.55 
而我必须处理成255才能做 

引用 10 楼 arong1234 的回复:
如果想输出255,你还不如直接printf("255\n")呢 
我觉得楼主首先要更正自己的观念,为什么254就不准确了?你的截断误差上限就是1,254,255,256都应该是绝对准确的 

#15


问题在于你的截断定义了你允许的误差是1,再这种定义下,255和254、256在数学上和物理上都是严格相等的
当你说2.549/2.546的时候,你规定的误差限变化了,结果当然不一样了
如果你printf("%d",1000*2.55)得到2.540,这才背离我说的规则,在这种条件下,误差限是0.001,你就可以保证误差小于原始值的0.001量级了

要注意你的运算所能达到的误差限,你所说的“准确”脱离了误差限毫无意义
引用 13 楼 novice2008 的回复:
2.55000000000000000 
和2.549999999999999 
如你所说,差别当然不大 
进行运算结果也无差别。 

但是一截断后差别能不大吗? 
别说255,254 
2.55和2.549也差很多了吧 
引用 10 楼 arong1234 的回复:
如果想输出255,你还不如直接printf("255\n")呢 
我觉得楼主首先要更正自己的观念,为什么254就不准确了?你的截断误差上限就是1,254,255,256都应该是绝对准确的 

#16


假如你的数据来自一个测量系统,你的数据是2.55,但是两次测量得到的是2.549和2.551,你这样运算后分别得到254和255,你觉得是什么导致差别?!是什么不准确?!其实所有的都是正确、准确的,不准确的源泉是你定义的“截断”操作,截断规定它必须可以允许最大为1的误差,在你这种规定下,为什么254就不等价于255呢?你规定误差限是1哦

#17


我不太懂你的意思。
你意思说误差范围是+-1。
那么250和251是一样的

引用 15 楼 arong1234 的回复:
问题在于你的截断定义了你允许的误差是1,再这种定义下,255和254、256在数学上和物理上都是严格相等的 
当你说2.549/2.546的时候,你规定的误差限变化了,结果当然不一样了 
如果你printf("%d",1000*2.55)得到2.540,这才背离我说的规则,在这种条件下,误差限是0.001,你就可以保证误差小于原始值的0.001量级了 

要注意你的运算所能达到的误差限,你所说的“准确”脱离了误差限毫无意义 
引用 13 楼 novice2008 的回复:

#18


我不是说了可以通过字符串转换成准确的数据嘛?
难道不是你想要的?

#19


哎,我就是想把2.55精确得放大100倍,就这么简单。
只是由于浮点数存储的关系,必须处理下

引用 16 楼 arong1234 的回复:
假如你的数据来自一个测量系统,你的数据是2.55,但是两次测量得到的是2.549和2.551,你这样运算后分别得到254和255,你觉得是什么导致差别?!是什么不准确?!其实所有的都是正确、准确的,不准确的源泉是你定义的“截断”操作,截断规定它必须可以允许最大为1的误差,在你这种规定下,为什么254就不等价于255呢?你规定误差限是1哦 

#20


对,如果你规定误差限是1,目的值是250,251是在误差范围内的,当然是准确的而且是一样的
额外多出来的“准确度”是没有任何意义的
引用 17 楼 novice2008 的回复:
我不太懂你的意思。 
你意思说误差范围是+-1。 
那么250和251是一样的 

引用 15 楼 arong1234 的回复:
问题在于你的截断定义了你允许的误差是1,再这种定义下,255和254、256在数学上和物理上都是严格相等的 
当你说2.549/2.546的时候,你规定的误差限变化了,结果当然不一样了 
如果你printf("%d",1000*2.55)得到2.540,这才背离我说的规则,在这种条件下,误差限是0.001,你就可以保证误差小于原始值的0.001量级了 

#21


你的当然可以啦,不过和4楼的比复杂了点,不是吗

引用 18 楼 wesleyluo 的回复:
我不是说了可以通过字符串转换成准确的数据嘛? 
难道不是你想要的?

#22


如果只是写个测试程序,这样做没什么特别的意义
如果你在做一个真正的计算系统,这种“准确得”放大要求是不合理的,你自己定义了一个不准确的计算过程,却希望一个准确的结果,显然是不可能的。任何数学计算都要考虑允许误差,如果你的结果在允许误差范围内,你永远应该认为它是准确的。准确不是你直观意义上那种准确

其实你的要求最简单的实现就是:
printf("%d", (int)(0.5+2.55*100));

那位用“字符串”转换成功的,我不知道是碰巧还是底层隐藏什么东西
引用 19 楼 novice2008 的回复:
哎,我就是想把2.55精确得放大100倍,就这么简单。 
只是由于浮点数存储的关系,必须处理下 

引用 16 楼 arong1234 的回复:
假如你的数据来自一个测量系统,你的数据是2.55,但是两次测量得到的是2.549和2.551,你这样运算后分别得到254和255,你觉得是什么导致差别?!是什么不准确?!其实所有的都是正确、准确的,不准确的源泉是你定义的“截断”操作,截断规定它必须可以允许最大为1的误差,在你这种规定下,为什么254就…

#23


引用 19 楼 novice2008 的回复:
哎,我就是想把2.55精确得放大100倍,就这么简单。 
只是由于浮点数存储的关系,必须处理下 

引用 16 楼 arong1234 的回复:
假如你的数据来自一个测量系统,你的数据是2.55,但是两次测量得到的是2.549和2.551,你这样运算后分别得到254和255,你觉得是什么导致差别?!是什么不准确?!其实所有的都是正确、准确的,不准确的源泉是你定义的“截断”操作,截断规定它必须可以允许最大为1的误差,在你这种规定下,为什么254就…

不是给你说了  通过字符串转换 是准确的么?
难道我的回复是隐藏的?

上面的也说了 你的整型的 最小误差就是+-1,如果你一定要通过整型直接实现准确,基本是没戏了。

#24


我21楼都给你回复了,你能好好看看帖子么,你偏要说你的好?!

引用 23 楼 wesleyluo 的回复:
不是给你说了 通过字符串转换 是准确的么? 
难道我的回复是隐藏的? 

上面的也说了 你的整型的 最小误差就是+-1,如果你一定要通过整型直接实现准确,基本是没戏了。

#25


其实这位和4楼的都在凑数字,如果是手工输入的,2.5500001你当然可以满足,但是实际计算中,如果你说2.55,则有效数字就是2位,最后一个5都是不准确的,他们这么凑出来其实和做物理试验凑数字一样,没有什么实际意义

引用 24 楼 novice2008 的回复:
我21楼都给你回复了,你能好好看看帖子么,你偏要说你的好?! 

引用 23 楼 wesleyluo 的回复:
不是给你说了 通过字符串转换 是准确的么? 
难道我的回复是隐藏的? 

上面的也说了 你的整型的 最小误差就是+-1,如果你一定要通过整型直接实现准确,基本是没戏了。 

#26


浮点数截断必然造成结果不精确。

不必要的时候当然不用。

为了方便计算,换成整数未尝不可。

当然我做的不是什么计算机系统。

引用 22 楼 arong1234 的回复:
如果只是写个测试程序,这样做没什么特别的意义 
如果你在做一个真正的计算系统,这种“准确得”放大要求是不合理的,你自己定义了一个不准确的计算过程,却希望一个准确的结果,显然是不可能的。任何数学计算都要考虑允许误差,如果你的结果在允许误差范围内,你永远应该认为它是准确的。准确不是你直观意义上那种准确 

其实你的要求最简单的实现就是: 
printf("%d", (int)(0.5+2.55*100)); 

那位用“字符串”转换成功…

#27


引用 24 楼 novice2008 的回复:
我21楼都给你回复了,你能好好看看帖子么,你偏要说你的好?! 

引用 23 楼 wesleyluo 的回复:
不是给你说了 通过字符串转换 是准确的么? 
难道我的回复是隐藏的? 

上面的也说了 你的整型的 最小误差就是+-1,如果你一定要通过整型直接实现准确,基本是没戏了。 

果然是这样的,4楼的简单明了,学习了。

#28


果然是这样的,4楼的简单明了,学习了。

#29


a = (int)(2.55 * 100 + 0.5); 

平常我就这么干

#30


引用 29 楼 snk0826027 的回复:
a = (int)(2.55 * 100 + 0.5);

平常我就这么干


缺陷有点大。  4F 正解。  

#1


四舍五入则取小数部分判断下,超过的话取上整ceil,否则下整floor

#2


你最后要输出255吗?

#3


要看你怎么定义“准确”了
2.55本身就无法准确输出,谁也不会知道你到底哪个值是准确的
实际上,2.55和2.499999在你这个问题上是等价的,因为你取整本身就是使结果更不准确的过程
你的取整的截断误差本来就是0.01这么大的,得到254、255正好是误差范围内,这在物理和编程范围内它都是准确的

引用楼主 novice2008 的帖子:
比如一个数2.55 
int a; 
a = (int)(2.55 * 100); 
最后a = 254。 

有什么比较好的方法准确输出??

#4


printf("%d\n",int(2.5500000001*100.0));

#5


引用 2 楼 topwork 的回复:
你最后要输出255吗?

是阿,我是想输出255

#6


引用 4 楼 fibbery 的回复:
printf("%d\n",int(2.5500000001*100.0));


是个好方法

#7


引用 3 楼 arong1234 的回复:
要看你怎么定义“准确”了 
2.55本身就无法准确输出,谁也不会知道你到底哪个值是准确的 
实际上,2.55和2.499999在你这个问题上是等价的,因为你取整本身就是使结果更不准确的过程 
你的取整的截断误差本来就是0.01这么大的,得到254、255正好是误差范围内,这在物理和编程范围内它都是准确的 

引用楼主 novice2008 的帖子:
比如一个数2.55 
int a; 
a = (int)(2.55 * 100); 
最后a = 254。 

有什么比较好的方法准…


#include <iostream>
int main(int argc,char* argv[])
{
printf("%d\n",int(2.5500000001*100.0));
printf("%f\n",2.55*100);
printf("%f\n",2.55);
return 0;
}

E:\MyDocs\debug>test
255
255.000000
2.550000

#8


这么写:

int a = 2.55 * 1000 / 10;

#9


没有任何意义
引用 8 楼 topwork 的回复:
这么写: 

C/C++ code
int a = 2.55 * 1000 / 10;

#10


如果想输出255,你还不如直接printf("255\n")呢
我觉得楼主首先要更正自己的观念,为什么254就不准确了?你的截断误差上限就是1,254,255,256都应该是绝对准确的

#11


能输出255当然直接255

只是数据是2.55
而我必须处理成255才能做

引用 10 楼 arong1234 的回复:
如果想输出255,你还不如直接printf("255\n")呢 
我觉得楼主首先要更正自己的观念,为什么254就不准确了?你的截断误差上限就是1,254,255,256都应该是绝对准确的 

#12


通过字符串转换。
这样写 就可以了。我试过的,可以准确输出。

double x=2.55,y;
char ch[20];
int b,c;
y=x*100;
sprintf(ch,"%01f",y);
c=atol(ch);
cout << "x=" << c << "y=" << y << endl;
cin >> b ;

#13


2.55000000000000000
和2.549999999999999
如你所说,差别当然不大
进行运算结果也无差别。

但是一截断后差别能不大吗?
别说255,254
2.55和2.549也差很多了吧
引用 10 楼 arong1234 的回复:
如果想输出255,你还不如直接printf("255\n")呢 
我觉得楼主首先要更正自己的观念,为什么254就不准确了?你的截断误差上限就是1,254,255,256都应该是绝对准确的 

#14


也许你只是想四舍五入,但是你这种描述还是不科学的。不过不管你了,反正你也不懂你的数据是255,但是输出254/256再数学、物理和科学界都是准确的。

引用 11 楼 novice2008 的回复:
能输出255当然直接255 

只是数据是2.55 
而我必须处理成255才能做 

引用 10 楼 arong1234 的回复:
如果想输出255,你还不如直接printf("255\n")呢 
我觉得楼主首先要更正自己的观念,为什么254就不准确了?你的截断误差上限就是1,254,255,256都应该是绝对准确的 

#15


问题在于你的截断定义了你允许的误差是1,再这种定义下,255和254、256在数学上和物理上都是严格相等的
当你说2.549/2.546的时候,你规定的误差限变化了,结果当然不一样了
如果你printf("%d",1000*2.55)得到2.540,这才背离我说的规则,在这种条件下,误差限是0.001,你就可以保证误差小于原始值的0.001量级了

要注意你的运算所能达到的误差限,你所说的“准确”脱离了误差限毫无意义
引用 13 楼 novice2008 的回复:
2.55000000000000000 
和2.549999999999999 
如你所说,差别当然不大 
进行运算结果也无差别。 

但是一截断后差别能不大吗? 
别说255,254 
2.55和2.549也差很多了吧 
引用 10 楼 arong1234 的回复:
如果想输出255,你还不如直接printf("255\n")呢 
我觉得楼主首先要更正自己的观念,为什么254就不准确了?你的截断误差上限就是1,254,255,256都应该是绝对准确的 

#16


假如你的数据来自一个测量系统,你的数据是2.55,但是两次测量得到的是2.549和2.551,你这样运算后分别得到254和255,你觉得是什么导致差别?!是什么不准确?!其实所有的都是正确、准确的,不准确的源泉是你定义的“截断”操作,截断规定它必须可以允许最大为1的误差,在你这种规定下,为什么254就不等价于255呢?你规定误差限是1哦

#17


我不太懂你的意思。
你意思说误差范围是+-1。
那么250和251是一样的

引用 15 楼 arong1234 的回复:
问题在于你的截断定义了你允许的误差是1,再这种定义下,255和254、256在数学上和物理上都是严格相等的 
当你说2.549/2.546的时候,你规定的误差限变化了,结果当然不一样了 
如果你printf("%d",1000*2.55)得到2.540,这才背离我说的规则,在这种条件下,误差限是0.001,你就可以保证误差小于原始值的0.001量级了 

要注意你的运算所能达到的误差限,你所说的“准确”脱离了误差限毫无意义 
引用 13 楼 novice2008 的回复:

#18


我不是说了可以通过字符串转换成准确的数据嘛?
难道不是你想要的?

#19


哎,我就是想把2.55精确得放大100倍,就这么简单。
只是由于浮点数存储的关系,必须处理下

引用 16 楼 arong1234 的回复:
假如你的数据来自一个测量系统,你的数据是2.55,但是两次测量得到的是2.549和2.551,你这样运算后分别得到254和255,你觉得是什么导致差别?!是什么不准确?!其实所有的都是正确、准确的,不准确的源泉是你定义的“截断”操作,截断规定它必须可以允许最大为1的误差,在你这种规定下,为什么254就不等价于255呢?你规定误差限是1哦 

#20


对,如果你规定误差限是1,目的值是250,251是在误差范围内的,当然是准确的而且是一样的
额外多出来的“准确度”是没有任何意义的
引用 17 楼 novice2008 的回复:
我不太懂你的意思。 
你意思说误差范围是+-1。 
那么250和251是一样的 

引用 15 楼 arong1234 的回复:
问题在于你的截断定义了你允许的误差是1,再这种定义下,255和254、256在数学上和物理上都是严格相等的 
当你说2.549/2.546的时候,你规定的误差限变化了,结果当然不一样了 
如果你printf("%d",1000*2.55)得到2.540,这才背离我说的规则,在这种条件下,误差限是0.001,你就可以保证误差小于原始值的0.001量级了 

#21


你的当然可以啦,不过和4楼的比复杂了点,不是吗

引用 18 楼 wesleyluo 的回复:
我不是说了可以通过字符串转换成准确的数据嘛? 
难道不是你想要的?

#22


如果只是写个测试程序,这样做没什么特别的意义
如果你在做一个真正的计算系统,这种“准确得”放大要求是不合理的,你自己定义了一个不准确的计算过程,却希望一个准确的结果,显然是不可能的。任何数学计算都要考虑允许误差,如果你的结果在允许误差范围内,你永远应该认为它是准确的。准确不是你直观意义上那种准确

其实你的要求最简单的实现就是:
printf("%d", (int)(0.5+2.55*100));

那位用“字符串”转换成功的,我不知道是碰巧还是底层隐藏什么东西
引用 19 楼 novice2008 的回复:
哎,我就是想把2.55精确得放大100倍,就这么简单。 
只是由于浮点数存储的关系,必须处理下 

引用 16 楼 arong1234 的回复:
假如你的数据来自一个测量系统,你的数据是2.55,但是两次测量得到的是2.549和2.551,你这样运算后分别得到254和255,你觉得是什么导致差别?!是什么不准确?!其实所有的都是正确、准确的,不准确的源泉是你定义的“截断”操作,截断规定它必须可以允许最大为1的误差,在你这种规定下,为什么254就…

#23


引用 19 楼 novice2008 的回复:
哎,我就是想把2.55精确得放大100倍,就这么简单。 
只是由于浮点数存储的关系,必须处理下 

引用 16 楼 arong1234 的回复:
假如你的数据来自一个测量系统,你的数据是2.55,但是两次测量得到的是2.549和2.551,你这样运算后分别得到254和255,你觉得是什么导致差别?!是什么不准确?!其实所有的都是正确、准确的,不准确的源泉是你定义的“截断”操作,截断规定它必须可以允许最大为1的误差,在你这种规定下,为什么254就…

不是给你说了  通过字符串转换 是准确的么?
难道我的回复是隐藏的?

上面的也说了 你的整型的 最小误差就是+-1,如果你一定要通过整型直接实现准确,基本是没戏了。

#24


我21楼都给你回复了,你能好好看看帖子么,你偏要说你的好?!

引用 23 楼 wesleyluo 的回复:
不是给你说了 通过字符串转换 是准确的么? 
难道我的回复是隐藏的? 

上面的也说了 你的整型的 最小误差就是+-1,如果你一定要通过整型直接实现准确,基本是没戏了。

#25


其实这位和4楼的都在凑数字,如果是手工输入的,2.5500001你当然可以满足,但是实际计算中,如果你说2.55,则有效数字就是2位,最后一个5都是不准确的,他们这么凑出来其实和做物理试验凑数字一样,没有什么实际意义

引用 24 楼 novice2008 的回复:
我21楼都给你回复了,你能好好看看帖子么,你偏要说你的好?! 

引用 23 楼 wesleyluo 的回复:
不是给你说了 通过字符串转换 是准确的么? 
难道我的回复是隐藏的? 

上面的也说了 你的整型的 最小误差就是+-1,如果你一定要通过整型直接实现准确,基本是没戏了。 

#26


浮点数截断必然造成结果不精确。

不必要的时候当然不用。

为了方便计算,换成整数未尝不可。

当然我做的不是什么计算机系统。

引用 22 楼 arong1234 的回复:
如果只是写个测试程序,这样做没什么特别的意义 
如果你在做一个真正的计算系统,这种“准确得”放大要求是不合理的,你自己定义了一个不准确的计算过程,却希望一个准确的结果,显然是不可能的。任何数学计算都要考虑允许误差,如果你的结果在允许误差范围内,你永远应该认为它是准确的。准确不是你直观意义上那种准确 

其实你的要求最简单的实现就是: 
printf("%d", (int)(0.5+2.55*100)); 

那位用“字符串”转换成功…

#27


引用 24 楼 novice2008 的回复:
我21楼都给你回复了,你能好好看看帖子么,你偏要说你的好?! 

引用 23 楼 wesleyluo 的回复:
不是给你说了 通过字符串转换 是准确的么? 
难道我的回复是隐藏的? 

上面的也说了 你的整型的 最小误差就是+-1,如果你一定要通过整型直接实现准确,基本是没戏了。 

果然是这样的,4楼的简单明了,学习了。

#28


果然是这样的,4楼的简单明了,学习了。

#29


a = (int)(2.55 * 100 + 0.5); 

平常我就这么干

#30


引用 29 楼 snk0826027 的回复:
a = (int)(2.55 * 100 + 0.5);

平常我就这么干


缺陷有点大。  4F 正解。