C#将数字四舍五入为双精度数的任意数字[重复]

Posted

技术标签:

【中文标题】C#将数字四舍五入为双精度数的任意数字[重复]【英文标题】:C# round a number to any arbitrary digit of a double [duplicate] 【发布时间】:2021-05-27 03:30:30 【问题描述】:

我希望将双精度数四舍五入到小数点右侧或左侧的任意数字。

Math.Round 仅适用于小数点右侧的数字,我需要能够四舍五入到最接近的 10s、100s、1000s...

所需输入/输出示例:

Round(1234.56789,  0) == 1235
Round(1234.56789, -3) == 1234.568
Round(1234.56789,  3) == 1000

这个问题不同于Round double in two decimal places in C#? 因为我需要将值四舍五入到小数点左侧的位置,例如1,2345,000四舍五入到最接近的10,000

【问题讨论】:

double 不能精确地表示具有有限十进制数字的数字,即使这些数字在最小值和最大值范围内,所以这不可能double解决。 如果您需要定点数类型,请考虑使用Decimal 类型。否则,您是否需要将其四舍五入以进行显示或计算?在完成计算之前对值进行四舍五入通常是错误的,所以我们可以推断这仅用于显示吗? (即:你想要一个字符串作为输出吗?) @J... 在这种情况下,我在将correction 添加到读数后对值进行四舍五入,校正引入了我的团队计量想要四舍五入的过度精度。小数可能是更合适的类型,但我的值不小于 1e-9 且不大于 1e+6 @Nifim 我再问一次 - 您是否在更正后四舍五入用于进一步计算?或者你是为了显示目的而在更正之后四舍五入(即:你想要一个字符串作为输出吗?)。老实说,我不确定“更正”如何增加“过度精度”。这听起来像是一个错误的概念。 @J... 是产生最终值,四舍五入后不再对值进行进一步计算,仅存储以备参考。一切都应我计量部门的要求。 【参考方案1】:

如果我们将10 取数字位置的幂,我们可以将双精度数四舍五入到任意精度

public double RoundToDigit(double i, int digitPosition)

    double precision = Math.Pow(10, digitPosition);

    double result = Math.Round(i / precision, 0) * precision;

    return result;

【讨论】:

为什么不double precision = Math.Pow(10, digitPosition); double result = Math.Round(i / precision, 0) * precision; ?根据提供的数据,它似乎产生了正确的结果 @GuruStron initial 我认为它会降低我的精确度,但现在看...我不知道为什么我会这样认为 @Magnetron (floor / 2) 被添加到初始值,所以 19 变为 24 并被锁定为 20 哦,错过了那行,抱歉

以上是关于C#将数字四舍五入为双精度数的任意数字[重复]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 C# 中的数字格式字符串在不使用小数 (F0) 时会将数字四舍五入?

为啥c ++将大数字四舍五入到上限,将小数四舍五入到下限[重复]

具有任意精度和一定比例的数字格式的 Oracle to_char 函数

Java 对任意数字进行四舍五入

将双精度数舍入到 x 有效数字

C# 将字符转换为双精度浮点型