.net 如何将分数数值转换为字符串;事实就是这样;?

.net 如何将分数数值转换为字符串;事实就是这样;?,.net,vb.net,visual-studio-2013,tostring,data-conversion,.net,Vb.net,Visual Studio 2013,Tostring,Data Conversion,我有这样一个浮点值:0.60000002384185791 我想将此值转换为如下字符串:0.60000002384185791(完全相同-无科学符号或剪裁精度) 但每当我尝试将此值转换为字符串时,它都会给出“0.600000023841858” 代码: 是否有任何方法可以“按原样”转换该值(没有科学的符号和精确性) 在C#中,它在一定程度上工作正常,但我需要Visual Basic中的解决方案。是否与语言有关(我希望不是)。您在评论中指出: 实际上,我的double持有这个值 我相信你所追求的是

我有这样一个浮点值:0.60000002384185791 我想将此值转换为如下字符串:0.60000002384185791(完全相同-无科学符号或剪裁精度)

但每当我尝试将此值转换为字符串时,它都会给出“0.600000023841858”

代码:

是否有任何方法可以“按原样”转换该值(没有科学的符号和精确性)


在C#中,它在一定程度上工作正常,但我需要Visual Basic中的解决方案。是否与语言有关(我希望不是)。

您在评论中指出:

实际上,我的double持有这个值

我相信你所追求的是成功

往返(“R”)格式说明符尝试确保转换为字符串的数值被解析回相同的数值。此格式仅支持Single、Double和BigInteger类型

对于双值和单值,在某些情况下,“R”格式说明符 未能成功往返原始值并提供 表现相对较差。相反,我们建议您使用 双值的“G17”格式说明符和“G9”格式说明符 要成功往返单个值

例如:

Dim ddd As Decimal = 0.60000002384185791D
Dim originalDouble As Double = ddd

Dim originalDoubleAsString As String = originalDouble.ToString("R")
Console.WriteLine(originalDoubleAsString)

Dim roundTripDouble As Double = Double.Parse(originalDoubleAsString)
Console.WriteLine("double round tripped correctly: {0}", (originalDouble = roundTripDouble))
输出:

0.60000002384185791

双往返正确:真


在数字上加上D,使之成为十进制?SamiKuhmonen说,你的例子中的问题是你的常数
0.60000002384185791
是一个不能容纳那么多数字的双精度数。设置
选项Strict On
以禁止自动转换,并确保从“某个方法”获得的值永远不会转换为双精度。@SamiKuhmonen,@Blackwood:我也这样做了,但运气不好。实际上,我的
double
保存了这个值。当我将鼠标悬停在它上面时,它会显示正确的值,即
0.60000002384185791
,但如果我将函数返回类型更改为
Decimal
,它只返回我
06D
。根据“双精度值最多有15位小数,尽管内部最多保留17位。”@布莱克伍德:那不是真的。我希望较长的值正好是二进制分数展开的值。精度位数表示更改尾数中的最低有效位会更改二进制分数的十进制转换,例如,值可能会扩展到…791,但增加尾数中的最低有效位可能会将值更改为,例如,0.803。感谢您的时间和支持。我已将您的答复标记为答案,因为它对我有效,小数点后17位。我们仍然面临这样的挑战:当十进制保存的精度大于17个字符时,这将不起作用,因为double不能保存超过17个字符的精度,例如:ddd=0.6000000238418579122334456d myVal=ddd'这将保存0.60000002384185791的双精度,而不是“实际值”decimal,我们也不能写下面这样的东西,因为它不受支持:Dim engineeringValue as String=ddd。ToString(“R”)““R”不是为小数而设的
Dim ddd As Decimal = 0.60000002384185791D
Dim originalDouble As Double = ddd

Dim originalDoubleAsString As String = originalDouble.ToString("R")
Console.WriteLine(originalDoubleAsString)

Dim roundTripDouble As Double = Double.Parse(originalDoubleAsString)
Console.WriteLine("double round tripped correctly: {0}", (originalDouble = roundTripDouble))