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正好是误差范围内,这在物理和编程范围内它都是准确的
2.55本身就无法准确输出,谁也不会知道你到底哪个值是准确的
实际上,2.55和2.499999在你这个问题上是等价的,因为你取整本身就是使结果更不准确的过程
你的取整的截断误差本来就是0.01这么大的,得到254、255正好是误差范围内,这在物理和编程范围内它都是准确的
#4
printf("%d\n",int(2.5500000001*100.0));
#5
是阿,我是想输出255
#6
是个好方法
#7
#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
没有任何意义
#10
如果想输出255,你还不如直接printf("255\n")呢
我觉得楼主首先要更正自己的观念,为什么254就不准确了?你的截断误差上限就是1,254,255,256都应该是绝对准确的
我觉得楼主首先要更正自己的观念,为什么254就不准确了?你的截断误差上限就是1,254,255,256都应该是绝对准确的
#11
能输出255当然直接255
只是数据是2.55
而我必须处理成255才能做
只是数据是2.55
而我必须处理成255才能做
#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也差很多了吧
和2.549999999999999
如你所说,差别当然不大
进行运算结果也无差别。
但是一截断后差别能不大吗?
别说255,254
2.55和2.549也差很多了吧
#14
也许你只是想四舍五入,但是你这种描述还是不科学的。不过不管你了,反正你也不懂你的数据是255,但是输出254/256再数学、物理和科学界都是准确的。
#15
问题在于你的截断定义了你允许的误差是1,再这种定义下,255和254、256在数学上和物理上都是严格相等的
当你说2.549/2.546的时候,你规定的误差限变化了,结果当然不一样了
如果你printf("%d",1000*2.55)得到2.540,这才背离我说的规则,在这种条件下,误差限是0.001,你就可以保证误差小于原始值的0.001量级了
要注意你的运算所能达到的误差限,你所说的“准确”脱离了误差限毫无意义
当你说2.549/2.546的时候,你规定的误差限变化了,结果当然不一样了
如果你printf("%d",1000*2.55)得到2.540,这才背离我说的规则,在这种条件下,误差限是0.001,你就可以保证误差小于原始值的0.001量级了
要注意你的运算所能达到的误差限,你所说的“准确”脱离了误差限毫无意义
#16
假如你的数据来自一个测量系统,你的数据是2.55,但是两次测量得到的是2.549和2.551,你这样运算后分别得到254和255,你觉得是什么导致差别?!是什么不准确?!其实所有的都是正确、准确的,不准确的源泉是你定义的“截断”操作,截断规定它必须可以允许最大为1的误差,在你这种规定下,为什么254就不等价于255呢?你规定误差限是1哦
#17
我不太懂你的意思。
你意思说误差范围是+-1。
那么250和251是一样的
你意思说误差范围是+-1。
那么250和251是一样的
#18
我不是说了可以通过字符串转换成准确的数据嘛?
难道不是你想要的?
难道不是你想要的?
#19
哎,我就是想把2.55精确得放大100倍,就这么简单。
只是由于浮点数存储的关系,必须处理下
只是由于浮点数存储的关系,必须处理下
#20
对,如果你规定误差限是1,目的值是250,251是在误差范围内的,当然是准确的而且是一样的
额外多出来的“准确度”是没有任何意义的
额外多出来的“准确度”是没有任何意义的
#21
你的当然可以啦,不过和4楼的比复杂了点,不是吗
#22
如果只是写个测试程序,这样做没什么特别的意义
如果你在做一个真正的计算系统,这种“准确得”放大要求是不合理的,你自己定义了一个不准确的计算过程,却希望一个准确的结果,显然是不可能的。任何数学计算都要考虑允许误差,如果你的结果在允许误差范围内,你永远应该认为它是准确的。准确不是你直观意义上那种准确
其实你的要求最简单的实现就是:
printf("%d", (int)(0.5+2.55*100));
那位用“字符串”转换成功的,我不知道是碰巧还是底层隐藏什么东西
如果你在做一个真正的计算系统,这种“准确得”放大要求是不合理的,你自己定义了一个不准确的计算过程,却希望一个准确的结果,显然是不可能的。任何数学计算都要考虑允许误差,如果你的结果在允许误差范围内,你永远应该认为它是准确的。准确不是你直观意义上那种准确
其实你的要求最简单的实现就是:
printf("%d", (int)(0.5+2.55*100));
那位用“字符串”转换成功的,我不知道是碰巧还是底层隐藏什么东西
#23
不是给你说了 通过字符串转换 是准确的么?
难道我的回复是隐藏的?
上面的也说了 你的整型的 最小误差就是+-1,如果你一定要通过整型直接实现准确,基本是没戏了。
#24
我21楼都给你回复了,你能好好看看帖子么,你偏要说你的好?!
#25
其实这位和4楼的都在凑数字,如果是手工输入的,2.5500001你当然可以满足,但是实际计算中,如果你说2.55,则有效数字就是2位,最后一个5都是不准确的,他们这么凑出来其实和做物理试验凑数字一样,没有什么实际意义
#26
浮点数截断必然造成结果不精确。
不必要的时候当然不用。
为了方便计算,换成整数未尝不可。
当然我做的不是什么计算机系统。
不必要的时候当然不用。
为了方便计算,换成整数未尝不可。
当然我做的不是什么计算机系统。
#27
果然是这样的,4楼的简单明了,学习了。
#28
果然是这样的,4楼的简单明了,学习了。
#29
a = (int)(2.55 * 100 + 0.5);
平常我就这么干
平常我就这么干
#30
缺陷有点大。 4F 正解。
#1
四舍五入则取小数部分判断下,超过的话取上整ceil,否则下整floor
#2
你最后要输出255吗?
#3
要看你怎么定义“准确”了
2.55本身就无法准确输出,谁也不会知道你到底哪个值是准确的
实际上,2.55和2.499999在你这个问题上是等价的,因为你取整本身就是使结果更不准确的过程
你的取整的截断误差本来就是0.01这么大的,得到254、255正好是误差范围内,这在物理和编程范围内它都是准确的
2.55本身就无法准确输出,谁也不会知道你到底哪个值是准确的
实际上,2.55和2.499999在你这个问题上是等价的,因为你取整本身就是使结果更不准确的过程
你的取整的截断误差本来就是0.01这么大的,得到254、255正好是误差范围内,这在物理和编程范围内它都是准确的
#4
printf("%d\n",int(2.5500000001*100.0));
#5
是阿,我是想输出255
#6
是个好方法
#7
#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
没有任何意义
#10
如果想输出255,你还不如直接printf("255\n")呢
我觉得楼主首先要更正自己的观念,为什么254就不准确了?你的截断误差上限就是1,254,255,256都应该是绝对准确的
我觉得楼主首先要更正自己的观念,为什么254就不准确了?你的截断误差上限就是1,254,255,256都应该是绝对准确的
#11
能输出255当然直接255
只是数据是2.55
而我必须处理成255才能做
只是数据是2.55
而我必须处理成255才能做
#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也差很多了吧
和2.549999999999999
如你所说,差别当然不大
进行运算结果也无差别。
但是一截断后差别能不大吗?
别说255,254
2.55和2.549也差很多了吧
#14
也许你只是想四舍五入,但是你这种描述还是不科学的。不过不管你了,反正你也不懂你的数据是255,但是输出254/256再数学、物理和科学界都是准确的。
#15
问题在于你的截断定义了你允许的误差是1,再这种定义下,255和254、256在数学上和物理上都是严格相等的
当你说2.549/2.546的时候,你规定的误差限变化了,结果当然不一样了
如果你printf("%d",1000*2.55)得到2.540,这才背离我说的规则,在这种条件下,误差限是0.001,你就可以保证误差小于原始值的0.001量级了
要注意你的运算所能达到的误差限,你所说的“准确”脱离了误差限毫无意义
当你说2.549/2.546的时候,你规定的误差限变化了,结果当然不一样了
如果你printf("%d",1000*2.55)得到2.540,这才背离我说的规则,在这种条件下,误差限是0.001,你就可以保证误差小于原始值的0.001量级了
要注意你的运算所能达到的误差限,你所说的“准确”脱离了误差限毫无意义
#16
假如你的数据来自一个测量系统,你的数据是2.55,但是两次测量得到的是2.549和2.551,你这样运算后分别得到254和255,你觉得是什么导致差别?!是什么不准确?!其实所有的都是正确、准确的,不准确的源泉是你定义的“截断”操作,截断规定它必须可以允许最大为1的误差,在你这种规定下,为什么254就不等价于255呢?你规定误差限是1哦
#17
我不太懂你的意思。
你意思说误差范围是+-1。
那么250和251是一样的
你意思说误差范围是+-1。
那么250和251是一样的
#18
我不是说了可以通过字符串转换成准确的数据嘛?
难道不是你想要的?
难道不是你想要的?
#19
哎,我就是想把2.55精确得放大100倍,就这么简单。
只是由于浮点数存储的关系,必须处理下
只是由于浮点数存储的关系,必须处理下
#20
对,如果你规定误差限是1,目的值是250,251是在误差范围内的,当然是准确的而且是一样的
额外多出来的“准确度”是没有任何意义的
额外多出来的“准确度”是没有任何意义的
#21
你的当然可以啦,不过和4楼的比复杂了点,不是吗
#22
如果只是写个测试程序,这样做没什么特别的意义
如果你在做一个真正的计算系统,这种“准确得”放大要求是不合理的,你自己定义了一个不准确的计算过程,却希望一个准确的结果,显然是不可能的。任何数学计算都要考虑允许误差,如果你的结果在允许误差范围内,你永远应该认为它是准确的。准确不是你直观意义上那种准确
其实你的要求最简单的实现就是:
printf("%d", (int)(0.5+2.55*100));
那位用“字符串”转换成功的,我不知道是碰巧还是底层隐藏什么东西
如果你在做一个真正的计算系统,这种“准确得”放大要求是不合理的,你自己定义了一个不准确的计算过程,却希望一个准确的结果,显然是不可能的。任何数学计算都要考虑允许误差,如果你的结果在允许误差范围内,你永远应该认为它是准确的。准确不是你直观意义上那种准确
其实你的要求最简单的实现就是:
printf("%d", (int)(0.5+2.55*100));
那位用“字符串”转换成功的,我不知道是碰巧还是底层隐藏什么东西
#23
不是给你说了 通过字符串转换 是准确的么?
难道我的回复是隐藏的?
上面的也说了 你的整型的 最小误差就是+-1,如果你一定要通过整型直接实现准确,基本是没戏了。
#24
我21楼都给你回复了,你能好好看看帖子么,你偏要说你的好?!
#25
其实这位和4楼的都在凑数字,如果是手工输入的,2.5500001你当然可以满足,但是实际计算中,如果你说2.55,则有效数字就是2位,最后一个5都是不准确的,他们这么凑出来其实和做物理试验凑数字一样,没有什么实际意义
#26
浮点数截断必然造成结果不精确。
不必要的时候当然不用。
为了方便计算,换成整数未尝不可。
当然我做的不是什么计算机系统。
不必要的时候当然不用。
为了方便计算,换成整数未尝不可。
当然我做的不是什么计算机系统。
#27
果然是这样的,4楼的简单明了,学习了。
#28
果然是这样的,4楼的简单明了,学习了。
#29
a = (int)(2.55 * 100 + 0.5);
平常我就这么干
平常我就这么干
#30
缺陷有点大。 4F 正解。