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

Why is the sprintf_s giving different result in different versions of Visual Studio?

本文关键字:结果 Studio 版本 sprintf 为什么 Visual      更新时间:2023-10-16
sprintf_s(buf, "%.*f", 14, 0.182696884245135);

in VS2008 = 0.18269688424514

in VS2015 = 0.18269688424513

sprintf_s的行为改变了吗?我怎样才能恢复以前的行为?

我们为Universal CRT和Visual c++ 2015重写了浮点解析器和格式化器,以提高正确性。参见Visual c++文档中Visual c++ 2015的重大变化;有一节题为"浮点格式和解析"。

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

0.18269688424513'49994693288181224488653242588043212890625

请注意第14位小数点后的勾号。第15位是4,因此当用14位小数格式化数字时,该数字将被"向下舍入"(或截断),而不是向上。

Visual c++ 2008的结果不正确。我不知道是否在解析或格式化过程中引入了错误。没有办法得到旧的,不正确的行为与通用CRT和Visual c++ 2015。

Vs2008使用80位浮点量,并且在转换为双精度数时将此更精确的值四舍五入。

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

我相信你可以通过改变编译器设置来切换这两种方案。