FormatNumber用0替换数字

时间:2018-09-08 01:24:30

标签: vb.net formatting decimal

不了解这一点: 从DataReader返回的数字:185549633.66000035

我们要求保持每个用户选择的小数位数。

例如:维持7个地方。

我们正在使用:

FormatNumber(dr.Item("Field"), 7, TriState.false, , TriState.True)

结果是:185,549,633.6600000。 我们希望最后保留3(或35)。

当从结果查询中减去两个数字时,我们得到一个增量,但是试图将这两个数字显示为6、7、8位是行不通的,因此向用户指示了错误的增量。

任何建议将不胜感激。

1 个答案:

答案 0 :(得分:1)

根据我的测试,您必须使用Double值而不是Decimal。不足为奇的是,可以在文档中找到解决您问题的方法。

首先,您不应该使用FormatNumber。我们已经不在VB6中了。要在VB.NET中格式化数字,请对该数字调用ToString。我对此进行了测试:

Dim dbl = 185549633.66000035R
Dim dec = 185549633.66000035D

Dim dblString = dbl.ToString("n7")
Dim decString = dec.ToString("n7")

Console.WriteLine(dblString)
Console.WriteLine(decString)

我看到了您描述的行为,即输出为:

185,549,633.6600000
185,549,633.6600004

我阅读了Double.ToString方法的文档(请注意FormatNumber将在内部调用ToString),其内容是这样的:

  

默认情况下,尽管内部最多保留17位数字,但返回值仅包含15位数字的精度。如果此实例的值大于15位,则ToString返回PositiveInfinitySymbol或NegativeInfinitySymbol而不是预期的数字。如果需要更高的精度,请使用“ G17”格式规范指定格式,该格式规范始终返回17位精度,如果使用该精度表示数字,则始终返回“ 15”,如果仅数字精度则返回17位。以最高的精度表示。

然后我对此进行了测试:

Dim dbl = 185549633.66000035R

Dim dblString16 = dbl.ToString("G16")
Dim dblString17 = dbl.ToString("G17")

Console.WriteLine(dblString16)
Console.WriteLine(dblString17)

结果是:

185549633.6600004
185549633.66000035