【问题标题】:How to get first digit after decimal point value without ToString() conversions? [duplicate]如何在没有 ToString() 转换的情况下获得小数点值后的第一个数字? [复制]
【发布时间】:2018-12-08 20:04:09
【问题描述】:

例如,如果我除以 1050 / 256,我得到 4.1015625。我需要小数点后第一位数字的值(在这种情况下为 1)。我不想涉及 ToString() 转换,然后再次将其解析为数字。

这张图片为itsme86:

Jeroen Mostert 的这张照片:

【问题讨论】:

  • (int)(4.1015625 * 10) % 10?
  • @itsme86 - 1050 / 250 = 4.2 然后(int)(4.2 * 10) % 10 = 1
  • 您要舍入还是截断? 4.16 应该是 4.1 还是 4.2
  • @Kosmos 你怎么得到 1? 4.2 乘以 10 是 42 模 10 是 2。
  • @Liam - 我想要小数点后第一个数字的值。 1050 / 250 不能替代 4.2。在那种情况下我想要那个 2。

标签: c# .net


【解决方案1】:

怎么样:

decimal result = 4.1015625m;

result = result - (int)result;
result = Decimal.Round(result, 1, MidpointRounding.AwayFromZero);

如果需要,可以将其合并为一行,但这样更易读。

【讨论】:

  • 这会产生0.1?
  • 这不适用于除法 1050 / 250 的结果,仍然给出 1,而我预计为 2。 -1 不是我的。我很高兴你能帮忙
  • @Liam 是的,它产生 0.1 我更新了它,通过在第二行而不是 Decimal.Round()
  • @Kosmos 确保在除以 1050 / 250 时得到 4.2。我再次运行它,第一行是 decimal result = (decimal)1050 / 250,得到了预期的 0.2
  • @Kosmos:记住,涉及整数的除法总是四舍五入为整数。如果您希望除法是小数,请使用1050m / 250mf 用于浮点数,d 用于双精度数。 (“M for money”是记住它的方式。)
【解决方案2】:
Math.Floor((4.1015625 - Math.Floor(4.1015625)) * 10)

【讨论】:

  • 这不适用于除法 1050 / 250 的结果,仍然给出 1,而我预计为 2。 -1 不是我的。我很高兴你能帮忙。
【解决方案3】:

我会这样做:

首先我会减去给定数字的小数分隔符之前的数字。 然后我将它乘以 10。 示例:4.2 - 4 = .2 * 10 = 2

注意:您不能使用浮点数进行精确的数学运算,因为某些值无法正确表示。因此,如果您需要这样的精确值,请始终转换为/使用小数,而不是浮点/双精度。

【讨论】:

  • 这在理论上很好,但是在代码中它不起作用,因为4.2 - 4是1.999999809 O_o 然后我将它乘以10得到1;附: -1 不是我写的。
猜你喜欢
  • 1970-01-01
  • 2019-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多