sprintf_s(buf, "%.*f", 14, 0.182696884245135);
VS2008中的= 0.18269688424514
VS2015中的= 0.18269688424513
sprintf_s的行为是否已更改?我怎样才能得到旧的行为?
答案 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不会这样做,只是截断文字。
我相信您可以通过更改编译器设置在两种方案之间切换。