变体浮点到双精度值转换,舍入到小数点后 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,您将需要使用十进制数据类型而不是二进制数据类型。
【讨论】:
或有理数据类型。或者是其他东西。有很多可能的解决方案,但正如您所说,float
和 double
不在其中。 (您可能还指出,这条评论是“典型的”:该标准确实允许十进制浮点表示,尽管我看到的最后一台在内部使用这种表示的机器早在 C++ 甚至 C 时代之前。)
@James 这里使用的标准是 COM 变体数据类型,VT_R4。那是 IEEE754 二进制单精度。理性也可以解决问题。
我想得到 2.6 作为输出,目前它给出的是 2.5。相同的代码适用于所有其他值,除了中点值四舍五入。
请尝试理解我的回答,并意识到您的变体在 VT_R4 中不包含值 2.55,因为根本没有具有该确切值的 VT_R4。以上是关于变体浮点到双精度值转换,舍入到小数点后 1 位 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
即使在 C 中使用“\n%.2f”后,也无法将浮点值舍入到最接近的第二个小数 [关闭]