变体浮点到双精度值转换,舍入到小数点后 1 位 [重复]

Posted

技术标签:

【中文标题】变体浮点到双精度值转换,舍入到小数点后 1 位 [重复]【英文标题】:Variant float to double value conversion with rounding to 1 decimal place [duplicate] 【发布时间】:2014-12-11 11:40:07 【问题描述】:

当使用 VariantChangeType() 将其转换为双精度时,我有值为“2.550000”的 VT_R4/浮点类型变体,将 VT_R8/双精度类型值变为“2.54999999998”。

::VariantChangeType(&var, &var, 0, VT_BSTR);
::VariantChangeType(&var, &var, 0, VT_R8);
double dOutputValue = var.dblVal; 

this double when is when is rounded of using

output.Format(_T("%3.1f"), dOutputValue);

给出的值是 2.5,而不是预期的 2.6。

请提出建议。

【问题讨论】:

谷歌“浮点精度”。 2.55 不能用浮点数精确表示。 【参考方案1】:

我有值“2.550000”的 VT_R4/float 类型的变体。

不,你没有。该值不能以二进制浮点类型精确表示。 closest single precision value to 2.55 是:

2.5499999523162841796875

如果您希望准确地表示 2.55,您将需要使用十进制数据类型而不是二进制数据类型。

【讨论】:

或有理数据类型。或者是其他东西。有很多可能的解决方案,但正如您所说,floatdouble 不在其中。 (您可能还指出,这条评论是“典型的”:该标准确实允许十进制浮点表示,尽管我看到的最后一台在内部使用这种表示的机器早在 C++ 甚至 C 时代之前。) @James 这里使用的标准是 COM 变体数据类型,VT_R4。那是 IEEE754 二进制单精度。理性也可以解决问题。 我想得到 2.6 作为输出,目前它给出的是 2.5。相同的代码适用于所有其他值,除了中点值四舍五入。 请尝试理解我的回答,并意识到您的变体在 VT_R4 中不包含值 2.55,因为根本没有具有该确切值的 VT_R4。

以上是关于变体浮点到双精度值转换,舍入到小数点后 1 位 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

将双精度数舍入到小数点后一位(去掉小数位)

将浮点数与字符串连接并舍入到小数点后 2 位

即使在 C 中使用“\n%.2f”后,也无法将浮点值舍入到最接近的第二个小数 [关闭]

将双精度数舍入到 x 有效数字

如何在 Torch 的 GPU 上将张量的元素限制/舍入到小数点后 4 位?

如何在小数点后将 Dart 中的双精度数舍入到给定的精度?