【问题标题】:vb.net Math.Round drops last 0 in price?vb.net Math.Round 价格下跌最后 0?
【发布时间】:2022-01-18 22:53:40
【问题描述】:

我在我的程序中使用了一个 Math.Round 函数,如下所示

Math.Round((ProductWeightByType * 4.18), 2)

这很完美,除非最后一个字符已经是 0,然后它会丢弃该 0,因此示例 $1.70 变为 $1.7

我该如何解决这个问题?

【问题讨论】:

  • 数字中没有“最后一个字符”。 Math.Round 不会丢弃任何字符,因为它不对字符串进行操作。也许在你的情况下 ProductWeightByType 是一个字符串?那么你一开始就做错了,应该把Option Strict On作为你代码文件的第一行。
  • 没有元数据与浮点数一起运行来说明它们四舍五入到多少小数位。因此,字符串转换代码将对什么是最正确的做出最好的猜测,并且在一般情况下,它不会保留结尾的零(因为它不知道这些零在哪里重要,在哪里不重要)。请注意,1.7 在二进制 FP 中不能完全表示,因此库已经通过隐藏最低有效小数位来美化您的数字。

标签: vb.net decimal price math.round


【解决方案1】:

处理金钱时,请使用十进制。它不会像 Double 那样遭受精度问题。哦,不清楚你没有使用十进制。好吧,您是否不使用字符串也不清楚。数字中没有字符,而是字符串。但这是一种使用正确类型的方法

Sub Main()
    Dim ProductWeightByType As Decimal = 0.4056D
    Dim cost As Decimal = 4.18D
    Dim formattedCost As String = $"{cost:C2}"
    Dim weightedCost As Decimal = ProductWeightByType * cost
    Dim formattedWeightedCost As String = $"{weightedCost:C2}"

    Console.WriteLine($"Cost: {cost}")
    Console.WriteLine($"Formatted Cost: {formattedCost}")
    Console.WriteLine($"Weight: {ProductWeightByType}")
    Console.WriteLine($"Weighted Cost: {weightedCost}")
    Console.WriteLine($"Formatted Weighted Cost: {formattedWeightedCost}")

    Console.ReadLine()
End Sub

成本:4.18
格式化成本:4.18 美元
重量:0.4056
加权成本:1.695408
格式化加权成本:1.70 美元

实际上,您可能不应该在这里使用Math.Round 来赚钱。如果您继续四舍五入并使用该值,您可能会开始累积几​​分之一的损失或收益。当然,如果你想显示成本,那么就像另一个答案一样格式化为货币(我的也是两次)。

注意,重要的是要说明如果值为$1.695408,则将其四舍五入为$1.70,获得$0.004592。将您的成本保持在其原始未损坏的数字格式中,不进行四舍五入,并且仅使用 C2 格式进行显示。

【讨论】:

    【解决方案2】:

    你应该尝试使用string format,这样的东西可以满足你的需要:

    String.Format("{0:C2}", Math.Round((ProductWeightByType * 4.18), 2))
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-14
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    • 2018-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多