有没有一种方法可以将.net中的三个有效数字(特别是f#)四舍五入到小数点之前?

有没有一种方法可以将.net中的三个有效数字(特别是f#)四舍五入到小数点之前?,.net,math,f#,.net,Math,F#,在excel中,函数调用“=round(12345,-3)”将解析为“12000”。也就是说,-3舍入参数允许在小数点之前应用有效数字 有没有人知道用f#实现这一点的简单方法(即现有的库调用,而不是编写自定义的除法/取整/乘法函数) Math.Round(12345,-3)失败,因为元组中的第二个值必须为正。您可以使用指定有效数字的数量。例如: String.Format("{0:G3}", value) 显然,这会给您一个字符串作为输出。也许这就是你要用它做的,或者如果不是,你可以用Int3

在excel中,函数调用“=round(12345,-3)”将解析为“12000”。也就是说,-3舍入参数允许在小数点之前应用有效数字

有没有人知道用f#实现这一点的简单方法(即现有的库调用,而不是编写自定义的除法/取整/乘法函数)

Math.Round(12345,-3)失败,因为元组中的第二个值必须为正。

您可以使用指定有效数字的数量。例如:

String.Format("{0:G3}", value)
显然,这会给您一个字符串作为输出。也许这就是你要用它做的,或者如果不是,你可以用
Int32.Parse()
或类似的方法将它转换回一个数字


还有一个答案,尽管在C#中,转换起来应该相当简单,因为它都是.NET Framework方法调用。

Luca Bolognese实现了所有这些。这可能包括您希望使用的舍入函数,其行为与Excel相同。

这将是我的方法。可能对每个人来说都不是最好的。实际上,数字也不是字符串格式

//采用有效数字计数(sF)的舍入函数


因为你所描述的并不是数学意义上的四舍五入到3个有效数字。3个显式数字将是数字中的前三个数字,因此在本例中为12300。至于这个问题,我唯一能想到的是一个取幂的函数,它的作用类似于“(Math.Round(12345*(10^-3))/10^-3)”但我不能将其转化为F#语法,我不知道这是否容易,因为它需要编写一个全新的函数,并可能引入有趣的舍入错误,等等。
let roundToSigFigs(x : float, sigFigs : byte) = 
    let absx = System.Math.Abs(x)
    System.Math.Round(0.5 + System.Math.Log10(absx))
    |> fun c -> float(c)-float(sigFigs)
    |> fun d  -> System.Math.Round(absx * 10.0**(-d)) * 10.0**d
    |> fun a -> a * float(System.Math.Sign(x))