为什么 ToString() 对我的 Double 值进行四舍五入?

发布于 2024-08-18 17:59:53 字数 186 浏览 9 评论 0原文

如何防止双精度值在转换为字符串时被舍入?我尝试了 Convert.ToStringToString() ,结果相同。

例如,我的双精度可能看起来像 77.987654321,两个字符串转换为 77.98765。我需要保持原值的精度。

How do I prevent my double value from being rounded when converting to a string? I have tried both Convert.ToString and ToString() with the same result.

For example my double may look something like 77.987654321, and the two strings conversions convert to to 77.98765. I need to keep the precision of the value as is.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

层林尽染 2024-08-25 17:59:53

默认情况下,Double.ToString() 方法返回 15 位精度。如果您想要 double 值在内部保存完整的 17 位数字,则需要将“G17”格式说明符传递给该方法。

String s = value.ToString("G17");

源自 MSDN 文档

默认情况下,仅返回值
包含15位精度
尽管最多 17 位数字
内部维护。如果值
该实例的数量超过 15
数字,ToString 返回
正无穷符号或
NegativeInfinitySymbol 代替
预期数量。如果您需要更多
精度,用指定格式
“G17”格式规范,其中
始终返回 17 位精度,
或“R”,如果满足则返回 15 位数字
数字可以用那个来表示
精度或 17 位数字(如果数字)
只能用最大值来表示
精度。

By default the .ToString() method of Double returns 15 digits of precision. If you want the full 17 digits that the double value holds internally, you need to pass the "G17" format specifier to the method.

String s = value.ToString("G17");

Sourced from the MSDN docs:

By default, the return value only
contains 15 digits of precision
although a maximum of 17 digits is
maintained internally. If the value of
this instance has greater than 15
digits, ToString returns
PositiveInfinitySymbol or
NegativeInfinitySymbol instead of the
expected number. If you require more
precision, specify format with the
"G17" format specification, which
always returns 17 digits of precision,
or "R", which returns 15 digits if the
number can be represented with that
precision or 17 digits if the number
can only be represented with maximum
precision.

空城旧梦 2024-08-25 17:59:53

尝试类似

myDouble.ToString("R")

另请参阅往返(“R”)格式说明符< /a>:

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

Try something like

myDouble.ToString("R")

See also The Round-trip ("R") Format Specifier:

The round-trip ("R") format specifier guarantees that a numeric value that is converted to a string will be parsed back into the same numeric value.

岁月蹉跎了容颜 2024-08-25 17:59:53

Jon Skeet 的 DoubleConverter 类有一个 ToExactString() 方法,该方法将以字符串形式返回 double 的精确值。

https://jonskeet.uk/csharp/DoubleConverter.cs

Jon Skeet's DoubleConverter class has a ToExactString() method which will return the exact value of the double as a string.

https://jonskeet.uk/csharp/DoubleConverter.cs

要走就滚别墨迹 2024-08-25 17:59:53

我认为四舍五入最后两位数字的主要答案是隐藏由于浮点/双精度有限精度而导致的数值不稳定/四舍五入。

没有四舍五入的示例:

(Math.Sqrt(7)).ToString("G17") = "2.6457513110645907"

(Math.Sqrt(7)+6).ToString("G17") = "8.6457513110645898"

最后 3 位数字看起来有点奇怪,对吧?

四舍五入示例:

(Math.Sqrt(7)).ToString() = "2.64575131106459"

(Math.Sqrt(7)+6).ToString() = "8.64575131106459"

看起来“完美”,对吧?

:-)

I would assume that the main answer for rounding away the last two digits, is to hide numerical instability/rounding due to float/double finite precision.

Example with no rounding:

(Math.Sqrt(7)).ToString("G17") = "2.6457513110645907"

(Math.Sqrt(7)+6).ToString("G17") = "8.6457513110645898"

Looks a bit strange in the last 3 digits, right?

Example with rounding:

(Math.Sqrt(7)).ToString() = "2.64575131106459"

(Math.Sqrt(7)+6).ToString() = "8.64575131106459"

Look "perfect", right?

:-)

情定在深秋 2024-08-25 17:59:53

对于使用 .NET/.NET Core 更新版本的任何人:

.NET Core 3.0 引入了一项重大更改,将 double.ToString() 更改为不再使用 "G15" 作为默认格式。相反,ToString() 返回最短的字符串,解析时返回相同的值。

因此,为了保持精度,您可以简单地使用ToString()

这类似于旧版本的 "R" 格式说明符,但即使如此,在此更改之前显然也不是 100% 准确。

请参阅重大事件.NET Core 3.0 中的变化

For anyone using updated versions of .NET/.NET Core:

.NET Core 3.0 introduced a breaking change that changed double.ToString() to no longer use "G15" as the default format. Instead ToString() returns the shortest string that when parsed returns the same value.

Therefore, to maintain precision, you can simply use ToString().

This is similar to older versions' "R" format specifier, but even that was apparently not 100% accurate prior to this change.

See Breaking changes in .NET Core 3.0

眼藏柔 2024-08-25 17:59:53

没有保证,但请尝试 ToString("R")。

No guarantees, but try ToString("R").

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文