C ++ Visual Studio Express 2012中的舍入错误

雷波

我在尝试用C ++编写自己的舍入函数时遇到了一个非常奇怪的功能。

以下两个函数均产生0.000作为输出。

double round ( double x, int y)
{
    double value = 0;

    value = floor(x*pow(10, y) + x>=0?0.5:-0.5)/pow(10, y);

    return value;
}

double round3(double x)
{
    double value = 0;

    value = floor(x * 1000 + x>=0?0.5:-0.5) / 1000;

    return value;
}

但是,此函数产生正确的输出,四舍五入到小数点后三位。

double round(double x)
{
    double value = 0;

    if (x >= 0){
        value = floor( x*1000 + 0.5 )/1000;
    }
    else{
        value = floor( x*1000 - 0.5 )/1000;
    }
    return value;
}

有人能启发我为什么会这样吗?

托尼·德罗伊

前两个具有运算符优先级错误,例如,(x * 1000 + x>=0?0.5:-0.5) / 1000被评估为(((x * 1000 + x) >= 0) ? 0.5 : -0.5) / 1000,因此在x正数时x0.0005,在负数时-0.0005

还要记住,双精度的“四舍五入”是一项棘手的事情……通常会因为第15位或第16位错误而出现错误,无论是因为无法表示所执行操作的“数学上完美的”结果恰好在double变量中,或者由于中间值或数学函数(例如)的近似值pow,因此您可能会发现自己认为是“ n.5”的值有时会四舍五入。如果对此感到困惑,请阅读每位计算机科学家应该了解的有关浮点算法的内容

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++ Visual Studio Express 2012中的舍入错误

来自分类Dev

在Visual Studio 2012 Express中设置C ++调试环境

来自分类Dev

在Visual Studio 2012 Express中设置C ++调试环境

来自分类Dev

在Visual Studio Express 2012中运行C代码的问题

来自分类Dev

在Visual Studio Express 2012(C#)中更新LocalDB文件

来自分类Dev

Visual Studio Express 2012,没有C ++的Windows窗体吗?

来自分类Dev

Visual Studio(Express 2013)中的C ++ 11线程异常传播

来自分类Dev

在Visual Studio 2012 Express中使用Dotfuscator

来自分类Dev

Visual Studio Express 2012 for WinJS项目

来自分类Dev

Visual Studio Express 2012 for WinJS项目

来自分类Dev

Visual Studio Express(Visual Basic)中的Excel.Application错误

来自分类Dev

如何在Visual Studio Express 2012中添加resx文件?

来自分类Dev

在Microsoft Visual Studio Express 2012中编辑PHP

来自分类Dev

如何在Visual Studio Express 2012中添加resx文件?

来自分类Dev

在Web的Visual Studio 2012 Express中无法识别DBContext

来自分类Dev

Visual Studio中的C ++错误

来自分类Dev

Visual Studio 2012的C中的命令参数

来自分类Dev

Visual Studio 2015 IIS Express 500错误

来自分类Dev

Visual Studio Express 2013中的Windows窗体错误

来自分类Dev

Microsoft Visual Studio 2012中的错误

来自分类Dev

如何在Visual Studio C#Express中制作独立文件?

来自分类Dev

Visual Studio Express 2013中面向初学者的C ++安装程序

来自分类Dev

在Visual Studio C ++ 2010 Express中scanf_s不适用于printf

来自分类Dev

如何在Microsoft Visual Studio Express中具有多个用于Web的C#类

来自分类Dev

如何使用Visual Studio Express 2012升级nuget

来自分类Dev

Microsoft是否永久删除了Visual Studio 2012 Express链接?

来自分类Dev

无法安装Visual Studio 2012 Express进行Phone 8.0开发

来自分类Dev

使用Visual Studio 2012 Express版本引用dll

来自分类Dev

Visual Studio Express 2012和Typescript输出目录

Related 相关文章

  1. 1

    C ++ Visual Studio Express 2012中的舍入错误

  2. 2

    在Visual Studio 2012 Express中设置C ++调试环境

  3. 3

    在Visual Studio 2012 Express中设置C ++调试环境

  4. 4

    在Visual Studio Express 2012中运行C代码的问题

  5. 5

    在Visual Studio Express 2012(C#)中更新LocalDB文件

  6. 6

    Visual Studio Express 2012,没有C ++的Windows窗体吗?

  7. 7

    Visual Studio(Express 2013)中的C ++ 11线程异常传播

  8. 8

    在Visual Studio 2012 Express中使用Dotfuscator

  9. 9

    Visual Studio Express 2012 for WinJS项目

  10. 10

    Visual Studio Express 2012 for WinJS项目

  11. 11

    Visual Studio Express(Visual Basic)中的Excel.Application错误

  12. 12

    如何在Visual Studio Express 2012中添加resx文件?

  13. 13

    在Microsoft Visual Studio Express 2012中编辑PHP

  14. 14

    如何在Visual Studio Express 2012中添加resx文件?

  15. 15

    在Web的Visual Studio 2012 Express中无法识别DBContext

  16. 16

    Visual Studio中的C ++错误

  17. 17

    Visual Studio 2012的C中的命令参数

  18. 18

    Visual Studio 2015 IIS Express 500错误

  19. 19

    Visual Studio Express 2013中的Windows窗体错误

  20. 20

    Microsoft Visual Studio 2012中的错误

  21. 21

    如何在Visual Studio C#Express中制作独立文件?

  22. 22

    Visual Studio Express 2013中面向初学者的C ++安装程序

  23. 23

    在Visual Studio C ++ 2010 Express中scanf_s不适用于printf

  24. 24

    如何在Microsoft Visual Studio Express中具有多个用于Web的C#类

  25. 25

    如何使用Visual Studio Express 2012升级nuget

  26. 26

    Microsoft是否永久删除了Visual Studio 2012 Express链接?

  27. 27

    无法安装Visual Studio 2012 Express进行Phone 8.0开发

  28. 28

    使用Visual Studio 2012 Express版本引用dll

  29. 29

    Visual Studio Express 2012和Typescript输出目录

热门标签

归档