本帖最后由 tsaiwn 于 2015-4-5 14:14 编辑
虽然 Arduino 可以用 sprintf(charArray, "format", data, data2, ...);
但请注意, 在 Arduino, 它的 "format" 不可用 %f, %lf, %ll .., 不好用 !
用 C++ 的 String( ) 串接, 简单又好用 !
(一)简单用法, 不注重格式, 只要有印出就好
要格式化输出, 最简单的方法就是直接用 C++ 的 String( ) 串接功能即可:
int height=168;
float weight=72.5;
Serial.println(String("")+"Your Height="+height + ", and Weight=" + weight);
说明:
只要第一个是 String(""), 之后不论整数 int, long, 实数 float 等都会自动转为字符串, 用 + 串接在一起 !
缺点:
float 小数点后会印出几位无法控制 :-(
(注意 UNO 如果用 double 其实会被偷改为 float )
(二)那如果是要印到 LCD 或 SoftwareSerial 软串口甚至 SPI 呢?
简单, 先放到 String 字符串即可, 之后爱怎样就怎样 :
int height=168;
float weight=72.5;
String gy = String("")+"Your Height="+height +
", and Weight=" + weight;
Serial.println(gy); // 印到串口
LCD.print(gy); // 假设你已经有 LCD. 可以用
(三)如果实数float要印出小数点后两位呢?
也很简单, 只是看起来有点麻烦而已(其实你用 Serial.print(float) 它也是偷偷这样做 !):
int height=168;
float weight=72.5;
String gy = String("")+"Your Height="+height;
gy += ", and Weight=";
// 开始处理 float weight 的值
long tmp = weight;
gy += tmp; // 整数部分
gy += "."; // 小数点, 废话
tmp = (weight -tmp)*100+0.5; // 小数, 四捨五入
if(tmp >= 100) tmp=99; // 防错, Also see (四)的 防错
if(tmp < 10) gy += "0";
gy += tmp;
Serial.println(gy); // 印到串口
LCD.print(gy); // 假设你已经有 LCD. 可以用
(四)如果实数float 只要印出小数点后一位呢?
也很简单, 参考著(三)写应该就会啦:
int height=168;
float weight=72.5;
String gy = String("")+"Your Height="+height;
gy += ", and Weight=";
// 开始处理 float weight 的值
long tmp = weight; // 整数部分
long yytmp = (weight -tmp)*10+0.5; // 小数, 四捨五入
if(yytmp >= 10) { // 防错
tmp += 1; // 整数部分 + 1
yytmp = 0;
}
gy += tmp; // 整数部分
gy += "."; // 小数点, 废话
//if(tmp < 100) gy += "0"; // 小数点后 >= 3位
//if(tmp < 10) gy += "0"; // 小数点后 >= 2位
gy += tmp;
Serial.println(gy); // 印到串口
LCD.print(gy); // 假设你已经有 LCD. 可以用
(五)如果实数float 要印出小数点后三位呢?
ㄟ, 阿我前面已经有(三)印到两位和(四)印到一位的范例,
参考著写应该就会啦 !
不过还有一简单写法,
就是先把 float 稍微加工处理后用 String 串接 :
float weight=72.12666; // 故意
long prec = 1000; // 三位
float aw = ((long)(weight*prec+0.5))/1.0/prec; //注意 /1.0/prec; 四捨五入
String ans = String("Weight=") + aw;
Serial.println(ans);
LCD.print(ans);
优点:
简单, 要小数点后两位就 prec = 100; 要小数点后一位就 prec = 10;
但请注意, 上面那 /1.0/prec 是必要的, 是让它先变为 float;
因为 /1.0 左边已经是 long 整数, 如果不先 /1.0 就直接做 /prec 则
变 long / long 將是 long 不对, 因为 38/10 是 3 不是 3.8喔 !
缺点:
因为 Arduino 考虑 MCU 能力有限, 无法用 double,
即使你写 double, 也会被偷改为 float;
可是 float 的有效精准度只有 7 位左右,
就是说 从最左边不是 0 的位开始只有七位到八位是可以信任的,
也就是 float x = 123.45678999; 与 float x = 123.45678922;
其实几乎是一样的, 这原因是因为 float 只有用 32 bits表示,
其中 23 bits 加上一个隱藏的 bit 共 24 bits 存有效值 significand;
所以把 float 转换为 binary 之后只能保留左边 24 bits,
这等於 binary 准確 24位, 相当於十进制的 24*0.3010=7.2位!
参考: http://zh.wikipedia.org/wiki/IEEE_754
(如看不到, 请用百度查询 "IEEE 754")
============================================================= |