假设我们有一个系统十进制数。
为了说明,让我们以一个ToString()表示如下的例子为例:
d.ToString() = "123.4500"
关于这个十月,可以说以下几点。在这里,小数位数被定义为小数点右边的位数。有效小数位数相似,但忽略小数部分出现的任何尾随零。(换句话说,这些参数的定义方式类似于SQL小数加上一些附加参数,以说明System.Decimal中小数部分尾随零的概念。)
- 精密度:7
- 规模:4
- 精密度:5
- 连续标度:2
给定一个任意的System.Decimal,我怎样才能有效地计算所有这四个参数,而不需要转换为String并检查String?解决方案可能需要Decimal.GetBits。
更多示例:
Examples Precision Scale EffectivePrecision EffectiveScale
0 1 (?) 0 1 (?) 0
0.0 2 (?) 1 1 (?) 0
12.45 4 2 4 2
12.4500 6 4 4 2
770 3 0 3 0
(?)或者将这些精度解释为零也可以。
6条答案
按热度按时间dtcbnfnu1#
您需要使用
Decimal.GetBits
。不幸的是,你必须处理一个96位的整数,而.NET中没有简单的整数类型可以处理96位。另一方面,您可以使用Decimal
本身。这里有一些代码,它产生与你的例子相同的数字。希望对你有用:)
kpbwa7wx2#
当我需要在向数据库写入十进制值之前验证精度和小数位数时,我偶然发现了这篇文章。我实际上想出了一个不同的方法来实现这一点,使用System.Data.SqlTypes.SqlDecliter,它比这里讨论的其他两个方法更快。
0tdrvxhp3#
使用ToString比Jon Skeet的解决方案快10倍。虽然这是相当快,这里的挑战(如果有任何接受者!)是为了击败ToString的性能。
我从以下测试程序中得到的性能结果是:ShowInfo 239 ms FastInfo 25 ms
oxiaedzo4#
我的解决方案与Oracle的精度和小数位数定义兼容,适用于NUMBER(p,s)数据类型:
https://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#i16209
问候。
5w9g7ksd5#
我目前有一个类似的问题,但我不仅需要规模,但也需要尾数为整数。基于以上的解决方案,请找到最快的,我能想出的,下面。统计信息:“ViaBits”在我的机器上进行700万次检查需要2,000毫秒。“ViaString”需要4,000毫秒来完成相同的任务。
dsf9zpds6#
从.NET 7开始,
Decimal
类型公开了一个Scale
property。所以你可以这样做: