c++ - 将 float 转换为 int 时的奇怪行为

标签 c++ casting

<分区>

我有一个类读取 csv 文件,其中包含小数点后不超过两位数的数字记录。

int ReadCellWithFloat(int cellNumber, int multiplier) throw (FSByFieldException)
{
    GoToCell( cellNumber );
    float number;
    FileStream >> number;
std::cout << "what we've got: " << number;
    if ( !FileStream.good() )
    {
        throw BuildException( FSByFieldException::NOT_FLOAT );
    }
    while ( multiplier-- )
    {
        number *= 10;
    }
std::cout << ' ' << number << ' ' << (int) number << std::endl;
    PassCell(); // here meaning pass comma separator
    return (int) number;
}

对于包含 float “8.49”的单元格,输出结果为:

what we've got: 8.49 849 848

为什么 849 在转换为整数时变成 848 以及如何修复它?

最佳答案

849 变为 848,因为纯转换只是截断了值。所以 (int) 4.8 == 4。您可能认为 8.49 * 10 * 10 是 849,但它不一定是真的 :) 它与 849 一样接近该体系结构可以表示,它在内部可能类似于 848.999999...一旦被截断就变成 848。

要修复它,您可以使用 (int) round(number),您可能也有兴趣查看 ceil()floor() 函数,以及有关浮点精度问题的一般信息,以避免在数字比较等方面遇到麻烦。

关于c++ - 将 float 转换为 int 时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16599865/

相关文章:

java - 如何避免 Java 中的 NumberFormatException?

c++ - 具有单继承的类的指针转换偏移

c++ - 如何嵌入实时单元测试函数的主体作为 Doxygen 的示例用法?

c++ - C++使用cpp中的头文件中的引用函数?

c++ - 部分覆盖文件描述符的内容

java - 对子类实例使用父类(super class)类型

java - 我错过了什么? NumberFormatException 错误

c++ - Visual Basic 和 C++

c++ - 是否可以打印这段代码中的特定行?

c - C 中不允许使用类型名称