为什么sprintf_s在不同版本的Visual Studio中给出不同的结果?

时间:2015-08-26 16:52:42

标签: c++ visual-c++ rounding stdio

sprintf_s(buf, "%.*f", 14, 0.182696884245135);
VS2008中的

= 0.18269688424514

VS2015中的

= 0.18269688424513

sprintf_s的行为是否已更改?我怎样才能得到旧的行为?

2 个答案:

答案 0 :(得分:9)

我们为the Universal CRT和Visual C ++ 2015重写了浮点解析器和格式化程序,以提高正确性。请参阅Visual C ++ 2015的Breaking Changes in Visual C++文档;有一节名为"浮点格式化和解析。"

Visual C ++ 2015结果是正确的舍入结果。输入字符串0.182696884245135将转换为以下双精度值,这是最接近的可表示值:

0.18269688424513'49994693288181224488653242588043212890625

请注意第14个小数位后的刻度线。第15个数字是4,因此在使用14个小数位格式化数字时,数字为"向下舍入" (或截断),而不是。

Visual C ++ 2008结果不正确。我不知道在解析或格式化过程中是否引入了错误。使用Universal CRT和Visual C ++ 2015无法获得旧的,不正确的行为。

答案 1 :(得分:1)

Vs2008使用80位浮点文字,并在转换为双精度时将这个更精确的值四舍五入。

Vs2015不会这样做,只是截断文字。

我相信您可以通过更改编译器设置在两种方案之间切换。