gpt4 book ai didi

c# - 修复小数点后的数字计数

转载 作者:太空宇宙 更新时间:2023-11-03 19:17:31 24 4
gpt4 key购买 nike

如何修复小数点后的位数 WITHOUT ROUNDING在 C# 中。

例如:十进制坐标 = 47.483749999999816; (部分地理坐标)

点后只需要保留6位:47.483749

最佳答案

你可能会用到

decimal truncated = Math.Truncate(coords * 1000000m) / 1000000m;

或者也许

decimal truncated = Math.Truncate(coords / 0.000001m) * 0.000001m;

在这两个中,我更喜欢后者。数字 0.000001m 在内部表示为尾数 1 以及小数位 6,因此除以和乘以它实际上只是一个移动小数点后六位。

最后乘以 0.000001m 的方法往往会给出小数点后正好六位数字的结果,必要时甚至会带有尾随零。例如 coords = 1.23m 将导致 truncated1.230000m

如评论中所述,如果 coords 太大(超过百万分之一),上述技术都会导致 OverflowException decimal.MaxValue)。

为了完整起见,这里有几个其他的解决方案:

decimal truncated = coords - coords % 0.000001m;

这似乎工作正常。虽然尾随零的数量并不总是正确的,但我相信它会给出相同的结果。 == 运算符(或 decimal.Equals)。

最后,您可以使用:

decimal truncated = Math.Round(coords - 0.0000005m, 6, MidpointRounding.AwayFromZero);

但这仅适用于非负坐标

如果您真正需要的是格式化的 string,请在 truncated 上调用 ToString 重载。但是,正如我指出的那样,请注意尾随零。如果您使用 .ToString("F6"),则应始终正好有六位小数。

当然您也可以使用字符串操作来截断。它会是这样的:

string coordsString = coords.ToString(CultureInfo.InvariantCulture);
int idxOfPoint = coordsString.IndexOf(CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator);
if (idxOfPoint != -1 && coordsString.Length > 6 + 1 + idxOfPoint)
coordsString = coordsString.Remove(6 + 1 + idxOfPoint);

// coordsString is now truncated correctly.
// If you need a decimal, use decimal.Parse(coordsString)

关于c# - 修复小数点后的数字计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15083658/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com