如何解决为什么这种从double到int的转换不起作用?
| 我一直在寻找适当的解释为什么会发生这种情况,但仍然不是很了解,因此,如果这是重新发布,我深表歉意。#include <iostream>
int main()
{
double x = 4.10;
double j = x * 100;
int k = (int) j;
std::cout << k;
}
Output: 409
我似乎无法用任何其他数字来复制此行为。即,用该格式的任何其他数字替换4.10,输出正确。
肯定有某种我不了解的低级转换内容。
谢谢!
解决方法
4.1不能精确地由ѭ1表示,它的近似值略小一些:
double x = 4.10;
printf(\"%.16f\\n\",x); // Displays 4.0999999999999996
所以j
会比410(即409.99 ...)小得多。转换为int
会舍弃小数部分,因此得到409。
(如果您想要另一个表现出类似行为的数字,则可以尝试8.2或16.4或32.8 ...看到模式吗?)
必填链接:每位计算机科学家都应了解的浮点算法。
,解决方法
int k = (int)(j+(j<0?-0.5:0.5));
逻辑
您遇到数字基数问题。
尽管在屏幕上显示4.10是十进制,但编译后将其表示为二进制浮点数,而.10不能完全转换为二进制,最后得到4.099999。
将409.999 ...强制转换为int只会丢弃数字。如果在强制转换为int之前加上0.5,则有效地舍入为最接近的数字或410(409.49将变为409.99,强制转换为409)
,尝试这个。
#include <iostream>
#include \"math.h\"
int main()
{
double x = 4.10;
double j = x * 100;
int k = (int) j;
std::cout << trunc(k);
std::cout << round(k);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。