我们有一个使用函数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
所以有两个问题
答案 0 :(得分:2)
答案 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中是不可能的。