double类型数据1.000000输出0.999999的问题?

绿色盒子 2018-09-10 03:44:29
当变量为1.0的时候,我想让他输出0.999999,代码是这样的:

if(x>=1.0f)
{
x=0.9999999f;
}
CString str;
str.Format("%.6f",x);

输出的仍然是1.000000
如何才能输出0.999999
...全文
1346 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_32182723 2018-09-15
  • 打赏
  • 举报
回复
qq_32182723 2018-09-15
  • 打赏
  • 举报
回复
绿色盒子 2018-09-13
  • 打赏
  • 举报
回复
我找到原因了,我真是个傻 逼
根本原因在于判断条件的错误,哎

//if (x>=1.0f)x=0.9999990f;//这是错误的,会导致0.9999997这样的数不会被赋值为0.9999990
if(x>0.9999990f)x=0.9999990f;
CString str;
str.Format("%.6f",x);
绿色盒子 2018-09-13
  • 打赏
  • 举报
回复
引用 26 楼 DelphiGuy 的回复:
[quote=引用 25 楼 Mr_sandman1994 的回复:]
[quote=引用 24 楼 DelphiGuy 的回复:]
不可能
double f = 0.9999990f;
printf("%.6f, %.6g\n", f, f);
// 0.999999, 0.999999

真的,偶尔会出现,概率大概是几万个数据出现十几二十个[/quote]

真的只能是你的程序有问题...
[/quote]
这就是我的代码啊,有什么问题吗

if (x>=1.0f)x=0.9999990f;
CString str;
STR.Format("%.6f",x);
  • 打赏
  • 举报
回复
引用 25 楼 Mr_sandman1994 的回复:
[quote=引用 24 楼 DelphiGuy 的回复:]
不可能
double f = 0.9999990f;
printf("%.6f, %.6g\n", f, f);
// 0.999999, 0.999999

真的,偶尔会出现,概率大概是几万个数据出现十几二十个[/quote]

真的只能是你的程序有问题...
赵4老师 2018-09-13
  • 打赏
  • 举报
回复
不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
赵4老师 2018-09-12
  • 打赏
  • 举报
回复
#include <stdio.h>
int main() {
float x;
double y;
x=0.999999f;
printf("%.6g\n",x);
x=0.9999999f;
printf("%.6g\n",x);
printf("%.7g\n",x);
y=0.999999999999999;
printf("%.14lg\n",y);
printf("%.15lg\n",y);
return 0;
}
//0.999999
//1
//0.9999999
//1
//0.999999999999999

绿色盒子 2018-09-12
  • 打赏
  • 举报
回复
引用 14 楼 zhao4zhong1 的回复:
无视zhao4zhong1的回复,你会浪费一大截青春!

我看了,但是我还是不知道怎么能解决我的问题
%g好像不错,但是他会截断后面的零,我的输出一定要六位小数,即使是零也要打印,所以我也不知道咋弄
赵4老师 2018-09-12
  • 打赏
  • 举报
回复
无视zhao4zhong1的回复,你会浪费一大截青春!
绿色盒子 2018-09-12
  • 打赏
  • 举报
回复
引用 24 楼 DelphiGuy 的回复:
不可能
double f = 0.9999990f;
printf("%.6f, %.6g\n", f, f);
// 0.999999, 0.999999

真的,偶尔会出现,概率大概是几万个数据出现十几二十个
  • 打赏
  • 举报
回复
不可能
double f = 0.9999990f;
printf("%.6f, %.6g\n", f, f);
// 0.999999, 0.999999
绿色盒子 2018-09-12
  • 打赏
  • 举报
回复
引用 20 楼 DelphiGuy 的回复:
[quote=引用 18 楼 Mr_sandman1994 的回复:]
[quote=引用 17 楼 DelphiGuy 的回复:]
你不知道是因为你发零分贴的理由~~~

没分啊,我要有分绝壁不搞非技术区啊[/quote]

好吧,根本原因在于0.9999999f=1.0f,因为超出了float能表达的精度,这个字面值被作为1.0存储,所以输出不会是0.999999。
[/quote]
我用的是double,精度完全够应该,关键是0.9999990f输出也是1.0,这就奇怪了
绿色盒子 2018-09-12
  • 打赏
  • 举报
回复
引用 16 楼 zhao4zhong1 的回复:
#include <stdio.h>
int main() {
float x;
double y;
x=0.999999f;
printf("%.6g\n",x);
x=0.9999999f;
printf("%.6g\n",x);
printf("%.7g\n",x);
y=0.999999999999999;
printf("%.14lg\n",y);
printf("%.15lg\n",y);
return 0;
}
//0.999999
//1
//0.9999999
//1
//0.999999999999999


出现了指数形式的计数2.56993e-006,哎
绿色盒子 2018-09-12
  • 打赏
  • 举报
回复
引用 17 楼 DelphiGuy 的回复:
你不知道是因为你发零分贴的理由~~~

出现了指数形式的计数2.56993e-006,哎
  • 打赏
  • 举报
回复
引用 18 楼 Mr_sandman1994 的回复:
[quote=引用 17 楼 DelphiGuy 的回复:]
你不知道是因为你发零分贴的理由~~~

没分啊,我要有分绝壁不搞非技术区啊[/quote]

好吧,根本原因在于0.9999999f=1.0f,因为超出了float能表达的精度,这个字面值被作为1.0存储,所以输出不会是0.999999。
绿色盒子 2018-09-12
  • 打赏
  • 举报
回复
引用 17 楼 DelphiGuy 的回复:
你不知道是因为你发零分贴的理由~~~

没分啊,我要有分绝壁不搞非技术区啊
绿色盒子 2018-09-12
  • 打赏
  • 举报
回复
引用 16 楼 zhao4zhong1 的回复:
#include <stdio.h>
int main() {
float x;
double y;
x=0.999999f;
printf("%.6g\n",x);
x=0.9999999f;
printf("%.6g\n",x);
printf("%.7g\n",x);
y=0.999999999999999;
printf("%.14lg\n",y);
printf("%.15lg\n",y);
return 0;
}
//0.999999
//1
//0.9999999
//1
//0.999999999999999


学习了,学习了
  • 打赏
  • 举报
回复
你不知道是因为你发零分贴的理由~~~
绿色盒子 2018-09-11
  • 打赏
  • 举报
回复
引用 8 楼 hou09tian 的回复:
MSDN上说
the precision specification can cause either truncation of the output value or rounding of a floating-point value.
当要转换的数是浮点值的时候,转换时需要进行四舍五入。
x=0.9999999f;

转换需要小数点后6位数字,而x小数点后面有7位,要进行四舍五入,所以转换后的str值是1.000000。
如果
x=0.999999f;

将x小数点后改为6位,此时str的值是0.999999。
另外,由于x的类型是double,所以建议将代码进行修改。以下代码在VS2015下调试通过
	double x = 2.0;
if (x >= 1.0)
{
x = 0.999999;
}
CString str;
str.Format(_T("%.6lf"), x);

请参考《C++浮点型变量的存储方式》
希望能够帮到你

四舍五入我考虑过,我试过 x=0.9999990f;
还是有问题,就是偶尔会出现还是输出1.000000的请款。所以感觉很奇怪
赵4老师 2018-09-11
  • 打赏
  • 举报
回复
加载更多回复(11)

15,440

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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