限制双倍到3位小数

xbo*_*nez 47 c# double truncate

这就是我想要实现的目标:

如果double有超过3个小数位,我想截断第三个以上的任何小数位.(不要圆.)

Eg.: 12.878999 -> 12.878
Run Code Online (Sandbox Code Playgroud)

如果double小于3位小数,则保持不变

Eg.:   125   -> 125
       89.24 -> 89.24
Run Code Online (Sandbox Code Playgroud)

我遇到了这个命令:

double example = 12.34567;
double output = Math.Round(example, 3);
Run Code Online (Sandbox Code Playgroud)

但我不想圆.根据上面发布的命令, 12.34567 -> 12.346

我想截断该值,使其变为: 12.345

Jon*_*eet 63

双打没有小数位 - 它们不是以十进制数字开头的.当截断为三位小数时,你可以得到"与当前值最接近的两倍",但它仍然不会完全相同.你最好还是用decimal.

话虽如此,如果只是圆角发生的方式是一个问题,你可以使用Math.Truncate(value * 1000) / 1000;可以做你想要的.(你根本不需要四舍五入的声音.)尽管如此,它仍然可能是"狡猾的",因为结果仍然不会真正只有三个小数位.但是,如果您使用小数值执行相同的操作,则可以使用:

decimal m = 12.878999m;
m = Math.Truncate(m * 1000m) / 1000m;
Console.WriteLine(m); // 12.878
Run Code Online (Sandbox Code Playgroud)

编辑:正如LBushkin指出的那样,你应该明确截断显示的目的(通常可以在格式说明符中完成)和截断以进行进一步的计算(在这种情况下,上面应该有效).

  • 如果"截断"仅用于显示目的,则可以在将值转换为字符串表示时实现.这将保持精度并避免尝试对浮点数执行精确的十进制操作的一些缺陷. (4认同)
  • +1表示这是"十进制"的工作. (2认同)

Chr*_*tin 41

我无法想到在显示目的之外明确失去精度的原因.在这种情况下,只需使用字符串格式.

double example = 12.34567;

Console.Out.WriteLine(example.ToString("#.000"));
Run Code Online (Sandbox Code Playgroud)

  • 我需要它,因为我将XML文件中的值与存储在DB中的值进行匹配.两个来源均由不同方填写.填写Db的那个选择不填写超过3位小数的任何内容,而XML文件通常可以有多达8个小数位 (5认同)

Mer*_*rmi 18

double example = 3.1416789645;
double output = Convert.ToDouble(example.ToString("N3"));
Run Code Online (Sandbox Code Playgroud)

  • 在示例之后我只需要一些小数位。这有帮助。:) (2认同)

Jos*_*osh 7

乘以1000然后使用截断然后除以1000.


LBu*_*kin 5

如果截断数字的目的是出于显示原因,那么只需在将double转换为字符串时使用适当的格式.

类似String.Format()Console.WriteLine()(和其他)的方法允许您限制格式化值的精度位数.

不建议尝试"截断"浮点数 - 在许多情况下,浮点数不具有精确的十进制表示.应用一种方法,比如缩放数字,截断它,然后将其缩小,可以很容易地将值更改为与"截断"值的预期完全不同的值.

如果你需要一个数字的精确十进制表示,你应该使用decimal而不是doublefloat.