铸造会奇怪地改变值
Casting changes value strangely
本文关键字:改变 更新时间:2023-10-16
为什么在这个(可怕的(C++代码片段中a1=72
而不是73
?
#include <iostream>
#include <string>
using namespace std;
int main (int argc, char* argv[])
{
double a = 136.73;
unsigned int a1 = (100*(a-(int)a));
cout << (a-(int)a) << endl; // 0.73
cout << 100*(a-(int)a) << endl; // 73
cout << a1 << endl; // 72 !
}
您可以在 http://codepad.org/HhGwTFhw 执行它
如果提高输出精度,您将看到(a - (int) a)
打印0.7299999999999898
。
因此,此值的截断(当您将其转换为int
时获得(确实72
。
(此处更新了代码板。
这是一个常见的精度问题。文字136.73
实际上代表数字
136.729999999999989768184605054557323455810546875
a-(int)a
的结果不是0.73
(即使这是显示的内容(,而是
0.729999999999989768184605054557323455810546875
当你把它乘以100
,你得到
72.9999999999989768184605054557323455810546875
而且由于从双精度转换为 int 会切断小数点后的所有内容,因此您可以得到72
.
0.73
不能精确表示,因此它四舍五入到接近它的数字,在本例中小于 0.73
. 当乘以 100 时,你会得到 72.[something]
,后来修剪为 72
。
更多信息
如果您阅读以下文章,可能会变得清晰:每个计算机科学家都应该知道的关于浮点运算的知识。
其他人已经表明,(a - (int)a)
的结果并不完全是 0.73,而是略低。文章解释了为什么会这样。这不是一个容易阅读的东西,但确实是每个使用 FP 的人都应该阅读并尝试理解的东西,IMO。
相关文章:
- 变量没有改变?通过向量的函数调用
- 如何改变c++应用程序的视觉效果
- C++在不同线程中改变向量
- 如何访问和改变存储在矢量C++中的对象
- 在C++行尾写一个分号或多个分号是否会改变任何内容
- 为什么字符串的 move() 会改变内存中底层数据的位置?
- 为什么 c++ 动态数组的大小没有改变?
- 为什么提升图库的 read_graphviz() 函数会改变节点的索引
- 在向量内更改变量的值不会改变其在向量外的值
- 为什么 GCC 不能假设 std::vector::size 在这个循环中不会改变?
- 改变或缩放两个正态分布以具有特定的相关系数
- 当我使用CHAR_INFO结构时,控制台会无缘无故地改变颜色
- 为什么我的函数接受"std::string"进行排序不会改变它?
- MFC:你能在CDateTimeCtrl中改变自旋的加速度吗?
- 为什么切换 for 循环的顺序会显著改变执行时间?
- 使用可变参数模板改变模板参数
- C++中物体改变识别的设计模式?
- 通过从构造函数中的'this'复制的指针改变常量对象
- C++11:具有互斥锁的线程看到原子变量的值发生变化,尽管这是唯一可以改变它的代码
- 如果没有重新散列,为什么 unordered_set::begin() 会改变?