如何强制浮点数和整数保留小数点或末尾的零?

3
我正在尝试通过RS232接口与机器进行交互,该机器要求所有输入都有小数分隔符,否则它会认为小数点位置有误。例如,如果我发送25,它会将其解释为0.025,但是25.00025.将被正确接收为25.000
我尝试使用Math.Round,但对于整数值,它不包括尾随的零。
因此,如果我有:
float a = 90;
float b = cos(24);
comPort.WriteLine("G01 A" + a + " B" + b);

我需要添加什么才能强制显示3位小数? 我不关心它是如何舍入的,也不关心是否截断。

3个回答

10

使用字符串格式化。您需要的所有信息均在以下MSDN页面上:

float a = 90;
float b = cos(24);
comPort.WriteLine("G01 A{0:F3} B{1:F3}", a, b);

F3 表示小数点后保留三位的定点数。

如果 comPort 类似于 TextWriter 这样的类,那么这个方法可以正常工作,因为该类具有支持格式化的WriteLine 重载方法。如果你直接使用 SerialPort,你将无法获得该重载方法,因此必须在其中显式使用 string.Format

comPort.WriteLine(string.Format("G01 A{0:F3} B{1:F3}", a, b));

同一个事物的等效写法:

comPort.WriteLine("G01 A{0:0.000} B{1:0.000}", a, b);

或者在C#6中:

comPort.WriteLine($"G01 A{a:F3} B{b:F3}");

编译器将其翻译为以下内容:

comPort.WriteLine(string.Format("G01 A{0:F3} B{1:F3}", a, b));

1
感谢您提供的参考和解释!还想补充一点,将“#”包含在0.000##中可以允许可选的额外小数位数。以防其他人以后需要这些信息。不过,我的机器最多只支持3位小数。 - Xander Luciano

4

像这样使用a和b上的ToString()方法:

comPort.WriteLine("G01 A" + a.ToString("F3") + " B" + b.ToString("F3"));

那应该可以了。

1

使用 String.Format 而不是使用字符串连接。

comPort.WriteLine(String.Format("G01 A{0:F3} B{1:F3}", a, b));

需要使用 String.Format 吗? - Xander Luciano
1
我不能确定comPort.WriteLine()上的签名是什么 :) 如果它是SerialPort,那么是的,需要使用String.Format。 许多TextWriter实现可以接受一个格式参数,然后是一个参数列表,所以如果这个comPort对象支持它,您将不需要使用String.Format进行包装。 - Chris Schaller
一旦您开始使用String.Format,您将发现其附加的好处是代码分析检查您是否实际指定了正确数量的参数以匹配您的格式参数。如果出现这样的故障,除非您犯错,否则在运行时不会被注意到。 :) - Chris Schaller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接