0

所以我有以下代码

int main(){

double d;
cin>>d;

while(d!=0.00)
{
    cout<<d<<endl;
    double m = 100*d;
    int n = m;
    cout<<n<<endl;
    cin>>d;
}

return 0;}

当我为 d 输入 20.40 时,n 的值是 2039 而不是 2040。我尝试替换int n = m 为,int n = (int) m但结果是一样的。有没有什么办法解决这一问题。提前致谢。

4

5 回答 5

3

您的代码截断 m 但您需要四舍五入。包括cmath和使用int n = round(m).

于 2013-08-21T15:20:15.773 回答
2

通常,十进制值不能使用像double. 因此,该值20.40表示为一个近似值,可用于恢复原始值(20.4; 不能保持精度),例如,在格式化该值时。使用这些近似值进行计算通常会放大误差。

正如其中一条评论中已经提到的,相关参考是论文“What Every Computer Scientist Should Know About Floating-Point Arithmetic”。解决您的麻烦的一种潜在方法是使用十进制浮点数,但是它还不是C ++ 标准的一部分。

于 2013-08-21T15:24:44.590 回答
1

单精度和双精度浮点数的存储方式与整数不同,因此整数(例如 5、10)实际上可能看起来像长小数(例如 4.9999001、10.000000001)。当您转换为 时int,它所做的只是截断整个数字。因此,如果该数字当前表示为4.999999999,则将其转换为 anint会给您4std::round大多数时候会为您提供更好的结果(如果数字是 4.6 并且您只想要整数部分,则回合将无法正常工作)。那么更大的问题是:您希望通过将 a 转换为 adouble来完成int什么?

通常,在处理浮点数时,您将需要使用一些epsilon值,即您的最小有效数字。因此,如果您想将 4.9999999 与 5 进行比较,您可以执行 (pseudo-code): if abs(5 - 4.9999999) < epsilon, return 5

例子

int main()
{
    double d;
    std::cin >> d;

    while (std::fabs(d - 0.0) > DBL_EPSILON)
    {
        std::cout << d << std::endl;
        double m = 100 * d;
        int n = static_cast<int>(m);
        if (std::fabs(static_cast<double>(n) - m) > DBL_EPSILON)
        {
            n++;
        }
        std::cout << n << std::endl;
        std::cin >> d;
    }

    return 0;
}
于 2013-08-21T15:24:48.117 回答
0

浮点数不能准确表示所有十进制数,有时会使用近似值。在您的示例中,最接近的可能确切数字是 20.39999999999999857891452847979962825775146484375。请参阅IEEE-754 分析以快速查看准确值。

您可以使用四舍五入,但大概您真的在寻找截断的前两位数字。只需在相乘之前或之后添加一个非常小的值,例如 0.0000000001。

于 2013-08-21T15:28:45.187 回答
0

将 double 转换为 int 会截断值,因此 20.40 可能是 20.399999 * 100 是 2039.99,因为 double 不是基数 10。您可以使用不会截断但会得到最接近 int 的 round() 函数。

int n = round(m);
于 2013-08-21T15:25:59.023 回答