asp.net – 检查.NET中两个双精度相等的问题 – 这个方法有什么问题?
|
所以我只是想深入研究这个问题……我有一个使用频繁的网络应用程序,这是两年来第一次使用相同功能对两个双打进行相等检查失败了一位同事说他’ d也一直使用多年. 我要在这里粘贴的函数的目标是将两个double值与4位精度值进行比较并返回比较结果.为了便于说明,我的价值观是: Dim double1 As Double = 0.14625000000000002 ' The result of a calculation Dim double2 As Double = 0.14625 ' A value that was looked up in a DB 如果我将它们传递给这个函数: Public Shared Function AreEqual(ByVal double1 As Double,ByVal double2 As Double) As Boolean
Return (CType(double1 * 10000,Long) = CType(double2 * 10000,Long))
End Function
比较失败了.在乘法并转换为Long之后,比较结果为: Return 1463 = 1462 我在这里回答了我自己的问题,但是我可以看到double1在双精度(17位数)内,并且强制转换正常. 我的第一个真正的问题是:如果我将上面的行改为以下行,为什么它能正常工作(返回True)? Return (CType(CType(double1,Decimal) * 10000,Long) = _
CType(CType(double2,Long))
Decimal不具有更高的精度,因此对Long的强制转换仍应为1463,并且比较返回False?我想我对这个东西有一个大脑放屁…… 其次,如果要更改此功能以进行比较我正在寻找更准确或更不容易出错,您会建议将其更改为更简单的东西吗?例如: Return (Math.Abs(double1 - double2) < 0.0001) 我会疯狂尝试类似的东西: Return (double1.ToString("N5").Equals(double2.ToString("N5")))
(我绝不会做上述事情,我只是对你的反应感到好奇.在我的申请中,它会非常低效.) 无论如何,如果有人能够对我在看到双打和小数到长期之间看到的差异有所了解,那就太棒了. 谢谢! 解决方法正如您所发现的那样,在这种情况下依赖于演员是容易出错的 – 根据演员时使用的规则,您可能无法得到您期望的数字.我强烈建议你在没有演员表的情况下编写比较代码.你的Math.Abs系列非常好. 关于你的第一个问题:
原因是从Double到Decimal的强制转换正在失去精度,导致0.1425到0.1425的比较. (编辑:长春站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ASP.NET如何确定是否排队请求?
- 用Dataset对象读取XML内容来绑定下拉列表框
- asp.net – 当绑定值包含冒号时,如何绑定GridView HyperLin
- asp.net core标签助手的高级用法TagHelper+Form
- asp.net-mvc-2 – ASP.NET MVC 2并列为隐藏值?
- ASP.NET MVC AJAX文档在哪里?
- 如何单元测试我的asp.net-mvc控制器的OnActionExecuting方法
- WPF 一个数据库连接测试的实现
- asp.net – 使用WebMethods和session时的最佳实践
- Asp.net核心IIS Express.如何查看日志消息?
- asp.net-mvc-3 – “区域”文件夹中的样式,脚本和
- asp.net – 在部分视图中强制使用没有Html.Begin
- asp.net – 如何正确过滤数据表(datatable.selec
- 如何在ASP.NET和C#中加载下拉列表?
- NHibernate中关于Inverse的理解和使用
- asp.net – NHibernate – ManagedWebSessionCon
- asp.net – “2015年4月20日Google帐户的OpenID2
- ASP.NET Core中实现用户登录验证的最低配置示例代
- 是否可以使用ASP.NET ScriptManager来使用Window
- asp.net-mvc-3 – dataannotations在主键上设置标
