如何使用 C# 舍入到最接近的千分之一

Posted

技术标签:

【中文标题】如何使用 C# 舍入到最接近的千分之一【英文标题】:How to round to the nearest thousandth using C# 【发布时间】:2020-08-10 13:46:15 【问题描述】:

在编码方面,我是一个极端的初学者,我正在构建一个击球率计算器作为我的第一个程序之一。

Console.WriteLine("Your batting average is: " + (hits / atBats) );

命中的输入是 165 和 atBats 的 419,计算结果为 0.3937947494。虽然这是正确的,但我希望这个数字读为 0.394。我该怎么做?

【问题讨论】:

.ToString("0.000"); 另外,如果您需要额外的计算,请查看 Math.Round(equationOrFormula, DigitsToRoundTo) @crtobin34 你的变量 hits 和 atBats 的数据类型是什么?它是 int 还是 double? @noobprogrammer 如果它们是整数,您将进行整数除法,结果不会得到 .393。 这能回答你的问题吗? Round double in two decimal places in C#? 【参考方案1】:

一个演示 Math.Round() 函数用法的示例:

using System;

class MainClass 
public static void Main (string[] args) 
    double result =  0.3937947494;

    Console.WriteLine(Math.Round(result,3));
 


// here result is = 0.3937947494, but you will get output as 0.394 in the console.

版本 2

using System;

public class Program

    public static void Main()
    
        int hits = 165;
        int atBats = 419;
        double result = (double)hits / (double)atBats;
        Console.WriteLine("Your batting average is: " +Math.Round(result,3));
    

// this produces the same result
// Your batting average is: 0.394 

第二种选择的屏幕截图:

版本 3: 提供更好的可读性(@Manti_Core 正确建议

using System;

public class Program

    public static void Main()
    
        double hits = 165;
        double atBats = 419;
        double result = hits/atBats;
        Console.WriteLine("Your batting average is: " + (hits / atBats).ToString("0.000"));
    
 

希望这会有所帮助。

【讨论】:

装箱 vs 字符串格式,想知道哪个更易读更快捷?【参考方案2】:

你可以使用string.Format:

var number = 0.3937947494;            
Console.WriteLine(string.Format("0:0.000", number));

【讨论】:

【参考方案3】:

你可以像下面这样简单:

double hits = 165;
double atBats = 419;
Console.WriteLine("Your batting average is: " + (hits / atBats).ToString("#.000"));
Console.Read();

这里你只是在格式化你想要显示的值。

字符串格式与装箱值的性能:

字符串格式

装箱值

【讨论】:

OP 没有提到 hits 和 atBats 是 int 还是 double。查看变量 hits 表明它不能是小数。它必须是 int。 (因为击球次数不能用十进制来衡量) 但是OP没有提到数据类型。。考虑内存优化怎么样?您将 double 用于不是 double 的东西......似乎它是 int 。由于 int 需要 2 或 4 个字节,而 double 需要 8 个字节,因此选择正确的数据类型也起着重要作用。您浪费了 4 个字节,将整数值作为双精度值,这当然不是预期的。但我并不否认我的回答中缺乏您的可读性问题。 @noobprogrammer 如果 OP 没有提到 int 或 double 那么我想这取决于我们来决定它,因为除以 int 不会给你像 .3937947494 OP提到的结果值,我猜猜这部分取决于常识 我同意你的观点。但是不必要地采用错误的数据类型不会达到目的。我们也需要从内存的角度思考......我正在改变我的答案以包括字符串格式。现在由 OP 决定使用哪一个:D @noobprogrammer 字符串格式已在此线程中被建议两次作为答案。

以上是关于如何使用 C# 舍入到最接近的千分之一的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法将时间戳向上或向下舍入到最接近的 30 分钟间隔?

将双精度舍入到最接近的非次正规表示

将 DateTime 舍入到最接近的半小时 [重复]

为啥 as_tibble() 将浮点数舍入到最接近的整数?

即使在 C 中使用“\n%.2f”后,也无法将浮点值舍入到最接近的第二个小数 [关闭]

将分钟向下舍入到最接近的一刻钟