strings.formatnumber限制为15个字符?

时间:2013-09-03 15:33:25

标签: .net vb.net

我们有一个使用函数Strings.formatnumber的.net可视化基础项目,因为它具有灵活性,即动态变量允许的小数位数。但是我遇到了一个令人讨厌的错误,因为这个函数似乎将所有内容都舍入为15位

所以

?  Strings.FormatNumber("123456789012345.66", 2,Microsoft.VisualBasic.TriState.True,Microsoft.VisualBasic.TriState.False,Microsoft.VisualBasic.TriState.False)
Results 123456789012345.00

?  Strings.FormatNumber("12345678901234.66", 2,Microsoft.VisualBasic.TriState.True,Microsoft.VisualBasic.TriState.False,Microsoft.VisualBasic.TriState.False)
Results 12345678901234.60

?  Strings.FormatNumber("1234567890123.66", 2,Microsoft.VisualBasic.TriState.True,Microsoft.VisualBasic.TriState.False,Microsoft.VisualBasic.TriState.False)
Results 1234567890123.66

?  Strings.FormatNumber("1234567890123456666.66", 2,Microsoft.VisualBasic.TriState.True,Microsoft.VisualBasic.TriState.False,Microsoft.VisualBasic.TriState.False)
Results 1234567890123460000.00

所以有两个问题

  • 为什么这个功能会这样做?
  • 我们可以使用.net函数将字符串转换为数字并返回一个字符串,小数位数可以是动态的吗?

4 个答案:

答案 0 :(得分:2)

double被定义为具有15-16位精度。

您可能需要使用decimal代替,它提供28位数字。

添加了decimaldouble

的VB.Net链接

答案 1 :(得分:2)

Double的定义精度为15-16位。

请尝试Decimal

  

decimal关键字表示128位数据类型。相比   浮点类型,十进制类型具有更高的精度和a   较小的范围,这使其适合金融和货币   计算。十进制类型的近似范围和精度   如下表所示。

答案 2 :(得分:1)

  

我们可以使用.net函数将字符串转换为数字并返回一个字符串,小数位数可以是动态的吗?

这是FormatNumber方法的一个简单包装器,允许您指定填充部分,小数位,千位分隔符和负括号的填充的最大长度:

Private Function MyFormatNumber(input As String, MaxLength As Integer, Optional RightDecimal As Integer = 2, Optional Thousands As TriState = TriState.UseDefault, Optional Negative As TriState = TriState.UseDefault) As String
    Dim TempNumber As Decimal = Decimal.Parse(input)
    Dim DecimalIndex As Integer = Decimal.Truncate(Math.Abs(TempNumber)).ToString.Length
    Dim LeftPad As Integer = (MaxLength - RightDecimal) - DecimalIndex
    MyFormatNumber = Strings.FormatNumber(TempNumber, RightDecimal, TriState.True, Negative, Thousands)
    If MyFormatNumber.StartsWith("(") Then
        MyFormatNumber = "(" + MyFormatNumber.Substring(1).PadLeft((MyFormatNumber.Length - 1) + LeftPad, "0"c)
    Else
        MyFormatNumber = MyFormatNumber.PadLeft(MyFormatNumber.Length + LeftPad, "0"c)
    End If
End Function

这样称呼:

Dim numberstr As String = ("-12345678901234566.12347", 22, 4, TriState.True, TriState.True)

输出结果为:

?numberstr
"(012,345,678,901,234,566.1235)"

这假设您要将字符串验证为数字类型。如果不是,您可以使用TryParse方法。

答案 3 :(得分:0)

double只有15-16个十进制位数的精度。虽然可以有更多数字,但它们大多是垃圾。如果你愿意,有些语言/环境会选择向你显示完整的数字,但由于所有这些数字都没有意义,所以这些用处很少;它们在计算中是不可靠的,并不像你期望数字那样表现,等等。它们本质上是二进制转换为十进制的工件。因此,.NET会自动舍入到双倍的小数精度以用于显示目的。它并没有欺骗你认为这个数字比实际更精确。

请注意,有些情况下,您想要显示这些数字(例如向某人展示其后有50位数字),但这在.NET中是不可能的。