Float 到 Double 的转换给出了不正确的值

Posted

技术标签:

【中文标题】Float 到 Double 的转换给出了不正确的值【英文标题】:Conversion of Float to Double gives incorrect value 【发布时间】:2015-03-17 11:38:21 【问题描述】:

我有一个捐款网页,人们可以在其中指定他们捐款的百分比用于哪个慈善机构。我已经进行了验证,以确保他们不能分配超过 100%。在人们添加十进制值之前,这可以正常工作。

百分比以浮点数的形式存储在 SQL 数据库中,我使用以下存储过程引入了可分配的总百分比。

SELECT giftid, SUM(percentage) totalPercentage 
FROM dbo.giftFundArea
WHERE giftid = @giftid
GROUP BY giftid

我的页面查看存储过程并使用以下代码访问值。

Dim percentageAllocated As Double = myReader.GetDouble(myReader.GetOrdinal("totalPercentage"))

当我在 Managememt Studio 中运行存储过程时,我看到分配给特定礼物的总百分比为 33.4%,但当我调试我的页面时,我看到 percentAllocated 的值为 33.400000000000006%。

这显然会影响我的验证。

谁能建议我如何阻止这种不正确的转换?

提前致谢。

【问题讨论】:

为什么首先在数据库中使用浮点数?见:***.com/questions/1056323/… 【参考方案1】:

Floating point values are intrinsically susceptible to rounding errors。使用不存在此问题的小数:

Dim percentageAllocated As Decimal = myReader.GetDecimal(myReader.GetOrdinal("totalPercentage"))

【讨论】:

以上是关于Float 到 Double 的转换给出了不正确的值的主要内容,如果未能解决你的问题,请参考以下文章

为啥 int 被提升为 double 而不是 float 以进行隐式转换

类型转换指令

SYCL/DPC++ cpu 版本给出了正确的结果,但 gpu 给出了不正确的数据

java 变量数据类型转换?byte, short, char, int, long, float, double

从 float 或 double 实例化 NSDecimalNumber 的正确方法

Double 或 float - 优化例程