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

如何使用Visual Studio Express 2012升级nuget

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

在Visual Studio 2012 Express中使用Dotfuscator

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

Visual Studio Express 2012 for WinJS项目

来自分类Dev

Visual Studio中的C ++错误

来自分类Dev

Visual Studio Express 2013中的Windows窗体错误

来自分类Dev

Visual Studio 2015 IIS Express 500错误

来自分类Dev

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

来自分类Dev

在Microsoft Visual Studio Express 2012中编辑PHP

来自分类Dev

Visual Studio Express 2012和Typescript输出目录

来自分类Dev

使用Visual Studio 2012 Express版本引用dll

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

Microsoft Visual Studio 2012中的错误

来自分类Dev

Visual Studio Express 2012 for WinJS项目

来自分类Dev

Visual Studio 2012的C中的命令参数

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

Related 相关文章

  1. 1

    如何使用Visual Studio Express 2012升级nuget

  2. 2

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

  3. 3

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

  4. 4

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

  5. 5

    在Visual Studio 2012 Express中使用Dotfuscator

  6. 6

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

  7. 7

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

  8. 8

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

  9. 9

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

  10. 10

    Visual Studio Express 2012 for WinJS项目

  11. 11

    Visual Studio中的C ++错误

  12. 12

    Visual Studio Express 2013中的Windows窗体错误

  13. 13

    Visual Studio 2015 IIS Express 500错误

  14. 14

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

  15. 15

    在Microsoft Visual Studio Express 2012中编辑PHP

  16. 16

    Visual Studio Express 2012和Typescript输出目录

  17. 17

    使用Visual Studio 2012 Express版本引用dll

  18. 18

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

  19. 19

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

  20. 20

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

  21. 21

    Microsoft Visual Studio 2012中的错误

  22. 22

    Visual Studio Express 2012 for WinJS项目

  23. 23

    Visual Studio 2012的C中的命令参数

  24. 24

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

  25. 25

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

  26. 26

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

  27. 27

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

  28. 28

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

  29. 29

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

热门标签

归档