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 ++将大数字四舍五入到上限,将小数四舍五入到下限[重复]