Joh*_*ock 6 c++ stdio rounding visual-c++
sprintf_s(buf, "%.*f", 14, 0.182696884245135);
Run Code Online (Sandbox Code Playgroud)
在VS2008 = 0.18269688424514
在VS2015 = 0.18269688424513
sprintf_s的行为是否改变了?我怎样才能得到旧的行为?
我们为Universal CRT和Visual C++ 2015 重写了浮点解析器和格式化程序,以提高正确性.请参阅Visual C++ 2015的Visual C++文档中的重大更改 ; 有一节题为"浮点格式化和解析".
Visual C++ 2015结果是正确的舍入结果.输入字符串0.182696884245135将转换为以下双精度值,这是最接近的可表示值:
0.18269688424513'49994693288181224488653242588043212890625
Run Code Online (Sandbox Code Playgroud)
请注意第14个小数位后的刻度线.第15位是a 4,因此在用14位小数位格式化数字时,数字是"向下舍入"(或截断),而不是向上.
Visual C++ 2008结果不正确.我不知道在解析或格式化过程中是否引入了错误.使用Universal CRT和Visual C++ 2015无法获得旧的,不正确的行为.
Vs2008 使用 80 位浮点文字,并在转换为双精度值时对这个更精确的值进行舍入。
Vs2015 不会这样做,只是截断了文字。
我相信您可以通过更改编译器设置在两种方案之间切换。
| 归档时间: |
|
| 查看次数: |
853 次 |
| 最近记录: |