【发布时间】:2019-01-15 00:35:45
【问题描述】:
我一直在寻找一些方法来确定 C# 中小数的比例和精度,这导致我提出了几个 SO 问题,但似乎没有一个有正确的答案,或者有误导性的标题(它们实际上是关于 SQL服务器或其他一些数据库,而不是 C#),或任何答案。我认为下面的帖子最接近我所追求的,但即使这样似乎也是错误的:
Determine the decimal precision of an input number
首先,对于规模和精度之间的差异似乎有些混淆。每谷歌(每 MSDN):
精度是数字中的位数。刻度是数字中小数点右侧的位数。
话虽如此,数字12345.67890M 的小数位数为 5,精度为 10。我还没有发现可以在 C# 中准确计算的单个代码示例。
我想创建两个辅助方法decimal.Scale() 和decimal.Precision(),以便通过以下单元测试:
[TestMethod]
public void ScaleAndPrecisionTest()
{
//arrange
var number = 12345.67890M;
//act
var scale = number.Scale();
var precision = number.Precision();
//assert
Assert.IsTrue(precision == 10);
Assert.IsTrue(scale == 5);
}
但我还没有找到一个可以做到这一点的 sn-p,虽然有几个人建议使用 decimal.GetBits(),其他人说,将其转换为字符串并解析它。
在我看来,将其转换为字符串并解析它是一个糟糕的主意,甚至可以忽略小数点的本地化问题。然而,GetBits() 方法背后的数学对我来说就像希腊语。
谁能描述在 C# 的 decimal 值中确定比例和精度的计算是什么样的?
【问题讨论】:
-
你能解释一下为什么你认为精度是 10 吗?该数字有 11 位数字,后面有两个零,剩下 9 个明显有效的数字。我没有看到 10 是从哪里来的。
-
你的编辑不会改变比例吗?
-
...是的。是的。我很烂。修复它
-
你们中的哪一位能向我解释一下编写一个像手动计数一样计数数字的函数有多难吗?无论如何,这些功能有什么好处?
-
@JeremyHolovacs 虽然我同意你关于将它转换为字符串的味道,但没有“数学”方法可以给你这些答案,仅仅是因为它们不是数学概念。这些概念是存储概念。例如,您对 Ron 说“在 C# 中,尾随零并非无关紧要”。好吧,我们可以同意它们在数学上微不足道吗?如果我们同意这一点,那么数学根本无法给你想要的答案。无论如何,我仍然想知道这些功能的好处。
标签: c# .net math decimal precision