【问题标题】:decimal type rounding issue十进制类型舍入问题
【发布时间】:2020-07-22 13:49:17
【问题描述】:

所以我有一个 C# web api 端点,它返回一个 C# 十进制值,即 49.10。所以我们将它返回到一个 VB.NET webforms 应用程序中,返回结果是 49.1,即使它们都是原始类型十进制。

真正让这个问题变得奇怪的是我们有 2 台本地机器,每台机器都有相同的代码,在我的机器上它返回为 49.10,但在同事机器上它返回为 49.1。

真正令人费解的情况似乎无法深入了解并想知道是否有人遇到过这个并知道我错过了什么。

C#模型是这样的……

[DataContract(Namespace = "")]
[Serializable]
public class TestClaim
{
   [DataMember(EmitDefaultValue = false)]
   public decimal VoucherSupplementFirstPair { get; set; }
}

VB.NET 模型是这样的...

<Serializable()>
Public Class TestClaim
   Public Property VoucherSupplementFirstPair As Decimal
End Class

我问的原因是因为它适用于一台机器而不是另一台机器,所以它可能与 Windows 设置有关?我以为 CLR 会处理这样的事情。

感谢您的建议。

【问题讨论】:

  • 在数学上它们是相同的。如果您选择 可视化尾随零,您会看到它们,但通常不会显示它们。 (否则,为什么期望 49.10 而不是 49.100?)
  • 49.10 是一个格式化选项(所以,一个字符串)。例如,货币表示。或暗示格式的其他表示形式。 数字49.1(如果你不格式化,你不能将数字显示为049.1)。
  • 您可能会看到十进制内部表示指数在 49.10 案例中保留一个额外数字的效果。见stackoverflow.com/questions/15348938/…。但这不是值得担心的(数学上)。值是一样的。
  • @Jimi 要记住的是,decimal 特别 10.1M 和 10.10M(以及 10.1000M 等)在内存中的存储方式不同。它们不是完全相同的值(尽管== 将为它们返回true)。因此为什么 dotnetfiddle.net/D2Jy76 。有趣的是,VB.NET 的行为似乎有所不同。 dotnetfiddle.net/dXNaOY
  • @mjwills 关于您的 vb.net 示例的一件事是,VS ide 会将 10.10D 常量更改为 10.1D。但是您可以通过将5.05D 添加到自身来查看“保留”零。见dotnetfiddle.net/pSzPci。此示例还演示了在十进制变量中10.1 等于10.10

标签: c# vb.net webapi


【解决方案1】:

我使用 VB.Net 已经有一段时间了。对于双/十进制,Vb 将自动截断零,因为它们不重要。如果要显示 2 个小数点,请使用 FormatNumber(i, x) 函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多