vb.net Math.Round 价格跌至最后 0?

vb.net Math.Round drops last 0 in price?

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

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

这很完美,除非最后一个字符已经是 0 然后它会删除那个 0 所以示例 $1.70 变成 $1.7

我该如何解决这个问题?

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

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

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

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

Cost: 4.18
Formatted Cost: .18
Weight: 0.4056
Weighted Cost: 1.695408
Formatted Weighted Cost: .70

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

请注意,重要的是要说明如果值为 .695408 那么它如何四舍五入为 .70,获得 [=14=].004592。保持您的成本为原始未损坏的数字格式,不进行四舍五入,仅使用 C2 格式仅用于显示。