1

我正在尝试将具有 12 位小数的双精度转换为字符串,但它只返回具有 10 位小数的字符串。

我尝试过ToStringFormat、FormatNumber、CStr 和System.Convert.ToString. 它们都返回 10 位小数。

(对于十进制数据类型也有相同的行为)

例子:

d = Date.Parse(sDate).ToOADate (value is 41261.001388888886)

d.ToString = 41261.0013888889

CStr(d) = 41261.0013888889

FormatNumber(d, 12) = 41,261.001388888900

在 和 的情况下FormatFormatNumber当指定 12 位时,该值将四舍五入为 10 位。

当我为一个DataView对象构建一个过滤器时,就会出现这种情况。

有没有办法解决这个问题,或者这是一个限制.Net

4

2 回答 2

1

在查看它声明的十进制类型的 MSDN 页面 时:

您可能需要使用 D 类型字符将较大的值分配给 Decimal 变量或常量。此要求是因为编译器将文字解释为 Long,除非文字类型字符跟在文字后面,如以下示例所示。

所以根据你的例子

Module Module1

    Sub Main()
        Dim d As Decimal
        d = 41261.001388888886D

        Console.WriteLine(d)
        Console.WriteLine(CStr(d))
        Console.WriteLine(FormatNumber(d, 12))
        Console.WriteLine(d.ToString("#0.000000000000"))
        Console.ReadLine()
    End Sub

End Module

显示:

41261.001388888886
41261.001388888886
4,1261.001388888886
41261.001388888886

试一试它似乎可以正常工作

Dim d As Decimal = CDec(String.Format("{0:G20}", Date.Parse(CStr(Now)).ToOADate))
于 2013-01-23T06:55:53.277 回答
0

Double.ToString 仅使用 15 位精度。

你应该使用d.ToString("R")

来自MSDN

往返 ("R") 格式说明符保证转换为字符串的数值将被解析回相同的数值。

...

当使用此说明符格式化 Single 或 Double 值时,首先使用通用格式对其进行测试,Double 精度为 15 位,Single 精度为 7 位。如果该值成功解析回相同的数值,则使用通用格式说明符对其进行格式化。如果该值未成功解析回相同的数值,则对 Double 使用 17 位精度,对 Single 使用 9 位精度对其进行格式化。

于 2013-01-23T15:12:54.587 回答