【问题标题】:.net double to decimal conversion dilemma - looking for suggestions.net double 到 decimal 的转换困境 - 寻找建议
【发布时间】:2016-05-05 19:25:33
【问题描述】:

全部,

我的设置:

  • 我们将 lat/lng 作为十进制值(最多 6 位小数)存储在数据库中,这些值在域模型(加载的实体)中作为十进制值(lat/lng)进行映射

    李> 1234563

因此,当我们从数据库中以十进制加载 lat/lng 时,应用程序最终会将其用作双精度数。这就是问题所在! double -> dec 的转换(发生舍入),我知道为什么会发生这种情况,那么最好的解决方法是什么?

问题示例:

如果用户以组件形式 (DMS) 输入纬度,并且在转换并将纬度保存到数据库中保存了不同的值,则舍入是一个问题。当它以组件形式被用户加载并查看时,它不是他最初输入的内容。

例如:

用户输入:N10-01-03.5

加载回来时:N10-01-03.468(由dbl->dec转换引起)

可能的解决方案:

1) 在我的“位置”类中使用小数(用于 lat/lng),每次我进行计算时,我都会将 lat/lng 从 dec -> dbl 转换为 dec。

2) 将 lat/lng 作为双精度值存储在数据库中(不确定这是否会成为未来的问题)。我们希望精确到小数点后 6 位。

3) 你的建议.....

【问题讨论】:

  • 双精度数字不应仅存在 6 位小数的舍入误差。小数点左边的数字有多大?
  • 首先,我同意约翰卡彭特的观点。这种差异看起来比我从小数和双精度之间的舍入误差所期望的要大得多
  • 其次,如果你真的需要你的值那么精确,那么你可能希望在任何地方都使用小数。
  • 看看我的回答,谢谢你们的 cmets。
  • “其次,如果你真的需要你的值那么精确,那么你可能希望在任何地方都使用十进制”。是的,但是每次我需要在 .net 中使用 Math.cos() 等进行一些三角计算时,我都必须将值转换为双精度,然后再转换回十进制。这也不是很好。

标签: c# .net type-conversion


【解决方案1】:

所有,我发现了问题。虽然,在 dbl -> dec 之间进行了一些舍入,但 3.5 秒变为 3.468 的原因是在我的休眠映射中我没有设置精度/比例值,所以休眠使用默认值并将值截断到小数点后 5 位,不管我在数据库中的 prec/scale 集。

所以值“10.0176388888889”被保存为“10.0176300000000000”。

【讨论】:

    猜你喜欢
    • 2021-10-23
    • 1970-01-01
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    相关资源
    最近更新 更多