不了解这一点: 从DataReader返回的数字:185549633.66000035
我们要求保持每个用户选择的小数位数。
例如:维持7个地方。
我们正在使用:
FormatNumber(dr.Item("Field"), 7, TriState.false, , TriState.True)
结果是:185,549,633.6600000。 我们希望最后保留3(或35)。
当从结果查询中减去两个数字时,我们得到一个增量,但是试图将这两个数字显示为6、7、8位是行不通的,因此向用户指示了错误的增量。
任何建议将不胜感激。
答案 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