当前位置: 首页 > 知识库问答 >
问题:

15位后不四舍五入的二至小数

林亦
2023-03-14
double d = -0.99999999999999956d;
decimal result = Convert.ToDecimal(d); // Result = -1
decimal result = (Decimal)(d); // Result = -1

因此,为了保持精度,我必须将double转换为字符串,然后调用convert.todecimal(String):

decimal result = System.Convert.ToDecimal(d.ToString("G20")); // Result = -0.99999999999999956d

这个方法是有效的,但是我想避免使用字符串变量来将Double转换为Decimal,而不是在15位数后取整?

共有1个答案

宋昕
2023-03-14

一种可能的解决方案是将d分解为n个倍数的精确和,最后一个倍数很小,包含转换为decimal时所需的所有尾随有效数字,而第一个(n-1)个倍数则完全转换为decimal。

对于-1.0和1.0之间的源doubled:

    decimal t = 0M;
    bool b = d < 0;
    if (b) d = -d;
    if (d >= 0.5) { d -= 0.5; t = 0.5M; }
    if (d >= 0.25) { d -= 0.25; t += 0.25M; }
    if (d >= 0.125) { d -= 0.125; t += 0.125M; }
    if (d >= 0.0625) { d -= 0.0625; t += 0.0625M; }
    t += Convert.ToDecimal(d);
    if (b) t = -t;

在ideone.com上进行测试。

 类似资料:
  • 我如何四舍五入到两个小数位?

  • 获取以下数字集--> 当相加时,这些给出一个整数。

  • 通常,四舍五入到小数点后2位是非常容易的 但是,舍入系统通常会舍入到最近的偶数。例如, 我想实现的是 所以,我在问如何做与上面相同的事情,在正数上有2个小数点位,而不是整数,以实现我前面所说的打印。

  • 问题内容: 我想最多舍入小数点后两位,但 仅在必要时才可以 。 输入: 输出: 如何在JavaScript中执行此操作? 问题答案: 使用 编辑: 为了确保像1.005这样的东西正确取整,我们使用

  • 我最多取小数点后2位四舍五入,但只限于必要时。 输入: 输出: 我如何在JavaScript中做到这一点?

  • 问题内容: 如果值为,则应将其格式化为。如果是,那么应该是。 问题答案: 这是一个实用程序,可以将双精度舍入(而不是截断)双精度至小数位数。 例如: 原始版本;提防这个 这在小数位数很高(例如)或整数部分很大(例如)的极端情况下会严重崩溃。感谢Sloin指出这一点。 多年来,我一直在使用上面的方法将“不太大”的双精度取整到2或3个小数位(例如,以秒为单位的清理时间用于记录目的:27.9876543