【问题标题】:How to get the next decimal given a decimal/precision如何在给定小数/精度的情况下获得下一个小数
【发布时间】:2018-08-28 20:34:25
【问题描述】:

我想以编程方式确定某个小数点后的下一个小数点。

例如,我有小数点 0.0000041

我想以编程方式在函数中生成 0.0000042。

如果我在使用 0.0000042 运行该函数后再次运行该函数,则新数字将为 0.0000043

如果我运行小数点为 0.0000049 的函数,则新数字将为 0.0000050 等等......

有没有办法做到这一点?

我不知道从哪里开始或参考什么来做这样的事情。

谢谢。

【问题讨论】:

  • 0.0000050,相当于0.000005上运行会发生什么?算法如何知道0.0000051 是“下一个”数字而不是0.000006
  • 从您的问题中不清楚您遇到问题的任务的哪一部分。您尝试了哪些方法,但以何种方式没有奏效?
  • 您尝试过什么,您尝试过什么失败了?理想情况下,您应该提供一个minimal reproducible example 来说明您的尝试,并包含有关它如何失败的具体信息,以及错误消息和/或错误输出。 Stack Overflow 不是代码编写服务;最好的问题是那些提供有用信息的问题,以便回答的人可以指导您设计自己的正确答案。请参阅How to Ask 一个好问题。
  • 为什么?基于什么规则?除了您之外,任何人都不清楚为什么 .003 应该增加到 0.0031 而 .0000041 应该增加到 .0000042。为什么 .003 不会增加到 .004?或者,更确切地说,为什么 .0000041 不会增加到 .00000411?
  • @AndrewMorton 没有办法用 double 来做到这一点,但是一种方法可以确定 decimal 类型的有效小数位数:给定decimal d,则:int sigDecimalPlaces = decimal.GetBits(d)[3] >> 16 & 0xff;

标签: c# vb.net


【解决方案1】:

您似乎正在寻找这样的东西:(如果您想手动指定精度,请在下方查看)

static decimal GetNextDecimal(decimal input)
{
    int count = BitConverter.GetBytes(decimal.GetBits(input)[3])[2];
    return input + (1m / (decimal)Math.Pow(10, count));
}

用法:

decimal num1 = 0.0000041m;
decimal num2 = 0.00002m;
decimal next = GetNextDecimal(num1);
decimal next2 = GetNextDecimal(num2);
Console.WriteLine(next);
Console.WriteLine(next2);

输出:

0.0000042
0.00003

我使用了this answer 的一点帮助来获取小数位数。


如果您最初想手动指定精度,可以改用以下内容:

static decimal GetNextDecimal(decimal input, int precision)
{
    return input + (1m / (decimal)Math.Pow(10, precision));
}

..它允许你做这样的事情:

decimal num1 = 0.003m;
decimal next = GetNextDecimal(num1, 3);
decimal next2 = GetNextDecimal(num1, 4);
Console.WriteLine(next);
Console.WriteLine(next2);

输出:

0.004
0.0031

【讨论】:

  • 在 cmets 中,OP 说“小数点可以从 0.003 改变,我希望它是 0.0031”,这让事情变得很混乱
  • @Jessieboley 这是你要找的行为吗?
  • @Jodrell 考虑到该评论和问题的标题,我更新了答案:"given the decimal/precision"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多