c# - 如何在 .net 中获取数字的大小?

标签 c# mathematical-expressions

我想用给定的 double 返回它的“大小”(称为 |number|,或点后没有数字的数字的数量),例如:

12.324654 -> 2
12 -> 2
0.99 -> 0
1.01 -> 1
901 -> 3
-0.99 -> 0
-9.999 -> 1

一定有一个我不熟悉的 .net 函数可以做到这一点..

谢谢。

最佳答案

尝试“log10(max(abs(number), 0.5)) + 1”向下舍入。

或者,在实际的 C# 语法中:

(int)(Math.Log10(Math.Max(Math.Abs(number), 0.5)) + 1)

好的,它是如何工作的?

首先,‖p = log10(x)‖是以 10 为底 logarithm x;也就是说,10 的 p 次方(或 1 后跟 p 零)的值等于 x。对数本质上是衡量数字的长度,除了它是 x 的平滑函数:

Graph of the base-10 logarithm of x

(请注意,在不提供以 10 为底的对数函数的语言中,我们始终可以将其计算为“log10(x) = log(< em>x)/log(10),‖ 其中 log() 是任意底数的对数函数。)

例如,我们有

log10(1) = 0.0
log10(10) = 1.0
log10(100) = 2.0
log10(1000) = 3.0

还有例如:

log10(5) = 0.69897
log10(50) = 1.69897
log10(500) = 2.69897
log10(5000) = 3.69897

一般来说,‖n ≤ log10(x) <n+1‖任何时候‖10 nx < 10n+1

查看上面的值,应该很容易看出,要获得整数中以 10 为底的数字的个数,我们应该将其以 10 为底的对数向下舍入到最接近的整数并加 1 (因为我们希望 10 的长度为 2,而不是 1)。

但是,还有一些边缘情况需要考虑:

首先,原提问者希望 −x 的长度等于 x 的长度。对数仅针对正数定义,因此我们将 x 替换为其绝对值以使其始终为正数。

其次,原提问者还希望 0 到 1 之间的数字长度为零。然而,对数可以取任意大的负值:

log10(0.1) = −1.0
log10(0.01) = −2.0
log10(0.001) = −3.0
log10(0.0001) = −4.0

事实上,‖log10(0) = −∞。为了满足这个要求,我们只需确保我们计算的数字的长度永远不会低于 0.5,方法是使用它的最大值并将 0.5 作为 log10() 的输入。 (我们可以使用 0.1 和 1 之间的任何数字作为截止值,但 0.5 恰好是一个很好的整数二进制分数。)

此外,我们必须确保在对数 四舍五入之前将对数加 +1,以便我们四舍五入的数字始终为非负数。这是因为 C# 中的 (int) 实际上将负数向上 舍入为零。例如,由于‖log10(0.5) ≈ −0.3,‖表达式 (int)Math.Log10(0.5) + 1(加法前四舍五入)的计算结果为‖0+ 1 = 1 而不是预期的 0。

关于c# - 如何在 .net 中获取数字的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6864991/

相关文章:

c# - WCF: "Failed to open System.ServiceModel.Channels.ClientReliableDuplexSessionChannel"

ios - 将包含 Latex Command for Mathematical 公式的 HTML 文本转换为输出正确公式的纯文本或属性文本

c - 以 float 和 int 表示形式计算 c 中表达式的不同值?

lua - 使用 Lua 评估数学表达式

function - 如何使用线性回归插值方法在 Julia 中查找变量?

sql - 如何评估保存在 SQL Server 中 nvarchar 变量中的数学表达式

c# - 传递独立于模型 MVC/C# 的 ID

c# - "Use Extension Methods Sparingly?"背后的动机是什么

c# - 在返回空 200 响应的 WebAPI 操作方法中抛出 HttpResponseException

c# - 尝试 Catch WebDriverTimeoutException 不起作用