chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

怎么修改顯示時的計數(shù)系統(tǒng)?怎么設(shè)置浮點(diǎn)數(shù)的顯示精度?

冬至子 ? 來源:iDoitnow ? 作者:艱默 ? 2023-07-18 15:04 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1. 修改顯示時的計數(shù)系統(tǒng)

ostream類是從ios類派生而來,ios類是從ios_base類派生而來。ios_base類存儲了描述格式狀態(tài)的信息,例如一個類成員中某些位決定使用哪個計數(shù)系統(tǒng)(如八/十/十六進(jìn)制),另外一個成員決定字段的寬度,且ios_baseostream間接基類,因此ostream也可以修改計數(shù)系統(tǒng)和字段寬度。

對于設(shè)置顯示整數(shù)的計數(shù)系統(tǒng)整數(shù),我們使用dechexoct控制符來控制整數(shù)是以十進(jìn)制、十六進(jìn)制還是八進(jìn)制顯示。例如:

int n = 13;
hex(cout);  //控制符實(shí)際上是函數(shù)但不是成員函數(shù),因此不必通過對象來調(diào)用,也可以使用cout < < hex;
cout < < n;  //輸出d
cout < < hex;//等同hex(cout)
cout < < n;  //輸出d
cout < < oct;//等同oct(cout),將輸出顯示設(shè)置為八進(jìn)制
cout < < n;  // 輸出15
cout < < dec < < n;//輸出13

2. 調(diào)整字段寬度

ostream使用width()成員函數(shù)將長度不同的數(shù)字放到寬度相同的字段中,該方法的原型如下:

int width(); //該方法返回字段寬度的當(dāng)前設(shè)置
int width(int i); //該方法將字段寬度設(shè)置為i個空格,并返回以前的字段寬度值。這樣使得能夠保存以前的值,以便以后恢復(fù)寬度值使用

width()方法只影響將顯示的下一個項(xiàng)目,然后字段的寬度將恢復(fù)為默認(rèn)值。例如:

cout < < "字段默認(rèn)寬度:" < < cout.width() < < endl;
cout < < "12345" < < endl;//顯示12345,方便查看后面每個對象顯示的時候占用的寬度
cout.width(3);//將字段寬度設(shè)置為3
cout < < 'a' < < 'b' < < 'c' < < endl;
cout.width(2);
cout < < "aaa";//測試當(dāng)字節(jié)寬度設(shè)置過小,是否影響顯示,該語句執(zhí)行后字符寬度將恢復(fù)為默認(rèn)值0
auto i = cout.width(3);//i=0
auto j = cout.width(4);//由于上一個語句已經(jīng)將寬度設(shè)置為3,因此j=3
auto k = cout.width(1);//k=4
cout < < endl;
cout < < "i = " < < i < < endl;
cout < < "j = " < < j < < endl;
cout < < "k = " < < k < < endl;

其對應(yīng)的輸出為

字段默認(rèn)寬度:0
12345
  abc
aaa
i = 0
j = 3
k = 4

從上面的例子可以看出,將字段寬度設(shè)置為3后,字符a顯示字符寬度為3,其余位置填充空格,且默認(rèn)為右對齊。將字段寬度設(shè)置為2后,顯示字符串"aaa",從結(jié)果我們可以看到,字符串正常顯示,由此可以看出,cout不會截短數(shù)據(jù)。當(dāng)顯示完字符串aaa后,我們將字符寬度設(shè)置為3,記錄上一項(xiàng)目的字符寬度為i,從打印結(jié)果來看,當(dāng)顯示完字符串aaa后,寬度自動恢復(fù)為默認(rèn)值0,因此i輸出結(jié)果為0。

3. 填充字符

默認(rèn)情況下,cout使用空格填充字段中未被使用的部分,我們在1.2中的例子已經(jīng)驗(yàn)證過了,那填充字符可以設(shè)置嗎?答案是肯定的,使用其成員函數(shù)fill()來改變填充字符,例如:

cout.fill('-');
cout < < "12345" < < endl;
cout.width(2);
cout < < 'a' < < 'b' < < endl;
cout.width(4);
cout < < 'a' < < 'b' < < endl;

輸出結(jié)果:

12345
-ab
---ab

由輸出結(jié)果可知,填充字符的設(shè)置與字符寬度設(shè)置不同的是,新填充的字符將一直有效,直到它更改為止。

4. 設(shè)置浮點(diǎn)數(shù)的顯示精度

C++的默認(rèn)精度為6位(末尾的0不顯示)。coutprecision()成員函數(shù)可以設(shè)置顯示精度,例如:

float a = 3.1415;
float b = 0.123456789;
cout < < "a = " < < a < < endl;
cout < < "b = " < < b < < endl;
cout.precision(2);
cout < < "a = " < < a < < endl;
cout < < "b = " < < b < < endl;

輸出結(jié)果:

a = 3.1415
b = 0.123457
a = 3.1
b = 0.12

從輸出結(jié)果可以看出,precision()也是設(shè)置一次,一直有效,直到重新設(shè)置為止。

5. setf()

C++使用setf()成員函數(shù)控制小數(shù)點(diǎn)被顯示時其他幾個格式選項(xiàng),其中cout.setf(std::ios_base::showpoint)設(shè)置cout打印浮點(diǎn)類型中末尾的0和小數(shù)點(diǎn)。例如:

float a = 13.1415;
float b = 0.123456789;
cout.setf(std::ios_base::showpoint);
cout < < "a = " < < a < < endl;
cout < < "b = " < < b < < endl;
cout.precision(2);
cout < < "a = " < < a < < endl;
cout < < "b = " < < b < < endl;

輸出結(jié)果:

a = 13.1415
b = 0.123457
a = 13.
b = 0.12

從輸出結(jié)果可以看出,setf()也是設(shè)置一次,一直有效,直到重新設(shè)置為止。

setf()有兩個原型,第一個為:

fmtflags setf(fmtflags); //fmtflags是bitmask類型(一種用來存儲各個位值的類型)的typedef名,用于存儲格式的標(biāo)記

該版本的setf()用來設(shè)置單個位控制的格式信息。參數(shù)是一個fmtflags值,指出要設(shè)置哪一位。返回值的類型為fmtflags的數(shù)字,指出所有標(biāo)記以前的設(shè)置。例如要將第11位設(shè)置為1,則需要傳遞一個第11位為1的數(shù)字,返回值為原來第11位的值。ios_base類定義了代表位值的常量,下表為其中一部分常用的定義:

1.jpg

注: 注意,僅當(dāng)基數(shù)為10時才使用加號。C++將十六進(jìn)制和八進(jìn)制都視為無符號的,因此對它們,無需使用符號(然而,有些C++實(shí)現(xiàn)可能仍然會顯示加號)?!?/p>

例子:

using std::cout;
using std::endl;
using std::ios_base;
int size = 40;
int a = 63;

cout.width(size);
cout < < "cout default: a =  " < < a < < endl;

cout.width(size);
cout.setf(ios_base::showpos);  //顯示+
cout < < "cout.setf(ios_base::showpos): a =  " < < a < < endl;

cout.width(size);
std::hex(cout);  //使用hex
cout < < "std::hex(cout): a =  " < < a < < endl;

cout.width(size);
cout.setf(ios_base::uppercase);  // 使用大寫字母
cout < < "cout.setf(ios_base::uppercase): a =  " < < a < < endl;

cout.width(size);
cout.setf(ios_base::showbase);  // 使用0X前綴
cout < < "cout.setf(ios_base::showbase): a =  " < < a < < endl;

cout.width(size);
cout < < "cout default: true =  " < < true < < endl;

cout.width(size);
cout.setf(ios_base::boolalpha);
cout < < "cout.setf(ios_base::boolalpha): true =  " < < true < < endl;

輸出結(jié)果:

cout default: a =  63
     cout.setf(ios_base::showpos): a =  +63
                   std::hex(cout): a =  3f
   cout.setf(ios_base::uppercase): a =  3F
    cout.setf(ios_base::showbase): a =  0X3F
                  cout default: true =  0X1
cout.setf(ios_base::boolalpha): true =  true

第二個setf()原型接受兩個參數(shù),并返回以前的設(shè)置:

fmtflags setf(fmtflags, fmtflags);

第一參數(shù)和以前一樣,也是一個包含了所需設(shè)置的fmtflags值。第二參數(shù)指出要清除第一個參數(shù)中的哪些位。例如,將第3位設(shè)置為1表示以10為基數(shù),將第4位設(shè)置為1表示以8為基數(shù),將第5位設(shè)置為1表示以16為基數(shù)。假設(shè)輸出是以10為基數(shù)的,而要將它設(shè)置為以16為基數(shù),則不僅需要將第5位設(shè)置為1,還需要將第3位設(shè)置為0——這叫作清除位(clearing the bit)。使用函數(shù)setf( )時,要做的工作多些,因?yàn)橐玫诙?shù)指出要清除哪些位,用第一參數(shù)指出要設(shè)置哪位。ios_base類為此定義了常量(如下表所示)。

1.jpg

具體地說,要修改基數(shù),可以將常量ios_base::basefield用作第二參數(shù),將ios_base::hex用作第一參數(shù)。也就是說,下面的函數(shù)調(diào)用與使用十六進(jìn)制控制符的作用相同:

cout.setf(ios_base::hex, ios_base::basefield); //與hex(cout);作用相同

其具體使用方法,如下例所示:

cout.setf(ios_base::left, ios_base::adjustfield);//左對齊
cout.setf(ios_base::showpos);//在正數(shù)前面加上+
cout.setf(ios_base::showpoint);//顯示小數(shù)點(diǎn)和末尾的0
cout.precision(3);
//使用科學(xué)計數(shù)法顯示,并保存默認(rèn)的計數(shù)法
ios_base::fmtflags old =
    cout.setf(ios_base::scientific, ios_base::floatfield);
cout < < "Left Justification:n";
long n;
for (n = 1; n <= 41; n += 10) {
    cout.width(4);
    cout < < n < < "|";
    cout.width(12);
    cout < < sqrt(double(n)) < < "|n";
}

cout.setf(ios_base::internal, ios_base::adjustfield);//居中對齊
//恢復(fù)默認(rèn)計數(shù)法
cout.setf(old, ios_base::floatfield);
cout < < "Internal Justification:n";
for (n = 1; n <= 41; n += 10) {
    cout.width(4);
    cout < < n < < "|";
    cout.width(12);
    cout < < sqrt(double(n)) < < "|n";
}

cout.setf(ios_base::right, ios_base::adjustfield);//右對齊
cout.setf(ios_base::fixed, ios_base::floatfield);//使用定點(diǎn)計數(shù)法
cout < < "Right Justification:n";
for (n = 1; n <= 41; n += 10) {
    cout.width(4);
    cout < < n < < "|";
    cout.width(12);
    cout < < sqrt(double(n)) < < "|n";
}

輸出結(jié)果:

Left Justification:
+1  |+1.000e+00  |
+11 |+3.317e+00  |
+21 |+4.583e+00  |
+31 |+5.568e+00  |
+41 |+6.403e+00  |
Internal Justification:
+  1|+       1.00|
+ 11|+       3.32|
+ 21|+       4.58|
+ 31|+       5.57|
+ 41|+       6.40|
Right Justification:
  +1|      +1.000|
 +11|      +3.317|
 +21|      +4.583|
 +31|      +5.568|
 +41|      +6.403|

注: 對于setf()的效果可以通過unsetf()消除,其原型為void unsetf(fmtflags mask);。其中,mask是位模式。mask中所有的位都設(shè)置為1,將使得對應(yīng)的位被復(fù)位。也就是說,setf()將位設(shè)置為1,unsetf()將位恢復(fù)為0?!?/p>

6. 標(biāo)準(zhǔn)控制符

對于用戶來說,使用setf()進(jìn)行格式化并不是最友好的方法。為此C++提供了多個控制符來完成相應(yīng)的格式化效果,其能夠調(diào)用setf(),并自動提供正確的參數(shù)。例如我們前面介紹過的dechexoct。C++常用控制符如下表所示:

1.jpg

7. 頭文件iomanip

使用iostream工具來設(shè)置一些格式值(如字段寬度)非常麻煩。為了簡化工作,C++在頭文件中提供了其他的一些控制符,不但可以提供前面提到過的格式設(shè)置,而且用起來方便。其中常用的控制符如下:

setprecision()//設(shè)置精度,其接受一個指定精度的整數(shù)參數(shù)
 setfill()     //填充字符,其接受一個指定填充字符的char參數(shù)
 setw()        //設(shè)置字段寬度,其接受一個指定字段寬度的整數(shù)參數(shù)。

由于它們都是控制符,因此可以用cout語句連接起來。這樣,setw()控制符在顯示多列值時尤其方便。其使用方法如下例所示:

#include < cmath >
#include < iomanip >
#include < iostream >
int main() {
    using namespace std;
    // use new standard manipulators
    cout < < fixed < < right;
    // use iomanip manipulators
    cout < < setw(6) < < "N" < < setw(14) < < "square root" < < setw(15)
        < < "fourth rootn";
    double root;
    for (int n = 10; n <= 100; n += 10) {
        root = sqrt(double(n));
        cout < < setw(6) < < setfill('.') < < n < < setfill(' ') < < setw(12)
            < < setprecision(3) < < root < < setw(14) < < setprecision(4) < < sqrt(root)
            < < endl;
    }
    return 0;
}

輸出結(jié)果:

N   square root   fourth root
....10       3.162        1.7783
....20       4.472        2.1147
....30       5.477        2.3403
....40       6.325        2.5149
....50       7.071        2.6591
....60       7.746        2.7832
....70       8.367        2.8925
....80       8.944        2.9907
....90       9.487        3.0801
...100      10.000        3.1623

注: 最后一行10.000,是使用fixed控制符導(dǎo)致顯示末尾的0。】

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 控制器
    +關(guān)注

    關(guān)注

    114

    文章

    17113

    瀏覽量

    184320
  • 存儲器
    +關(guān)注

    關(guān)注

    38

    文章

    7653

    瀏覽量

    167414
  • 計數(shù)器
    +關(guān)注

    關(guān)注

    32

    文章

    2291

    瀏覽量

    96422
  • C++語言
    +關(guān)注

    關(guān)注

    0

    文章

    147

    瀏覽量

    7300
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    浮點(diǎn)數(shù)顯示問題

    如何將一個浮點(diǎn)數(shù)例如12.4顯示在lcd12864上面
    發(fā)表于 09-20 08:17

    請問用keil怎么在串口上顯示浮點(diǎn)數(shù)?

    用keil怎么在串口上顯示浮點(diǎn)數(shù)啊,float和double定義,用f和lf輸出都是顯示ERROR啊
    發(fā)表于 04-03 10:22

    STM32CubeIDE是否需要配置任何設(shè)置才能正確顯示浮點(diǎn)數(shù)

    我正在用浮點(diǎn)數(shù)調(diào)試代碼。我正在使用實(shí)時表達(dá)式來觀察值,但即使我選擇了小數(shù)格式,我也沒有得到浮點(diǎn)值的小數(shù)位。我似乎記得在另一個項(xiàng)目中這樣做并獲得小數(shù)位。是否需要配置任何設(shè)置才能正確顯示
    發(fā)表于 12-19 08:21

    浮點(diǎn)數(shù)在單片機(jī)數(shù)據(jù)采集監(jiān)控系統(tǒng)中的應(yīng)用

    單片機(jī)能夠直接處理的數(shù)是定點(diǎn)數(shù),然而實(shí)際上需要輸入、處理和顯示的數(shù)據(jù)卻是浮點(diǎn)數(shù),本文詳細(xì)介紹了浮點(diǎn)數(shù)在單片機(jī)系統(tǒng)中的實(shí)現(xiàn)。關(guān)鍵詞:
    發(fā)表于 08-13 15:38 ?44次下載

    浮點(diǎn)數(shù)的表示方法

    浮點(diǎn)數(shù)的表示方法  浮點(diǎn)數(shù),是指小數(shù)點(diǎn)在數(shù)據(jù)中的位置可以左右移動的數(shù)據(jù)。它通常被表示成:    N = M* RE  這里的M(Mantissa)被稱為浮點(diǎn)數(shù)
    發(fā)表于 10-13 17:13 ?1.7w次閱讀
    <b class='flag-5'>浮點(diǎn)數(shù)</b>的表示方法

    浮點(diǎn)數(shù)常用的編碼方法

    浮點(diǎn)數(shù)常用的編碼方法  前面已經(jīng)說到,在計算機(jī)內(nèi),浮點(diǎn)數(shù)被表示為如下格式:    通常情況
    發(fā)表于 10-13 17:21 ?4733次閱讀
    <b class='flag-5'>浮點(diǎn)數(shù)</b>常用的編碼方法

    STM32如何通過 printf 打印出浮點(diǎn)數(shù)

    這是由于 IAR 默認(rèn)選擇的 printf 庫不支持浮點(diǎn)數(shù)的的輸出??稍?b class='flag-5'>設(shè)置選項(xiàng)中修改。如下:默認(rèn)使用 small,改為 auto 即可。
    發(fā)表于 05-07 16:47 ?2w次閱讀

    Xilinx怎么定點(diǎn)數(shù)轉(zhuǎn)浮點(diǎn)數(shù)

    轉(zhuǎn)化為的浮點(diǎn)數(shù)可以是單精度也可以是雙精度。
    發(fā)表于 07-05 08:09 ?4031次閱讀
    Xilinx怎么定<b class='flag-5'>點(diǎn)數(shù)</b>轉(zhuǎn)<b class='flag-5'>浮點(diǎn)數(shù)</b>

    單片機(jī)顯示浮點(diǎn)數(shù)

    ;stdarg.h"void OLED_ShowFNum(u8 x,u8 y,char *str,...) //顯示浮點(diǎn)數(shù){ char buf[10]; va_list ptr; //用于獲取不確定個數(shù)的參數(shù) ...
    發(fā)表于 11-13 14:06 ?24次下載
    單片機(jī)<b class='flag-5'>顯示</b><b class='flag-5'>浮點(diǎn)數(shù)</b>

    談一談浮點(diǎn)數(shù)精度問題

    還是要從浮點(diǎn)數(shù)的存儲和標(biāo)識出發(fā)來處理該問題,既然浮點(diǎn)數(shù)天然就存在一定的誤差,而有時候計算又無法獲得唯一的數(shù)值,如下圖所示,浮點(diǎn)數(shù)計算出來的實(shí)軸上的值都會因?yàn)?b class='flag-5'>浮點(diǎn)數(shù)無法存儲標(biāo)識而近似到其
    的頭像 發(fā)表于 08-11 14:28 ?5352次閱讀
    談一談<b class='flag-5'>浮點(diǎn)數(shù)</b>的<b class='flag-5'>精度</b>問題

    什么是浮點(diǎn)數(shù)浮點(diǎn)數(shù)在內(nèi)存中的存儲

    浮點(diǎn)型簡單講就是實(shí)數(shù)的意思。浮點(diǎn)數(shù)在計算機(jī)中用以近似表示任意某個實(shí)數(shù)。
    的頭像 發(fā)表于 11-09 11:07 ?6398次閱讀
    什么是<b class='flag-5'>浮點(diǎn)數(shù)</b>?<b class='flag-5'>浮點(diǎn)數(shù)</b>在內(nèi)存中的存儲

    什么是浮點(diǎn)數(shù)

    Python數(shù)據(jù)類型第一種:字符串(str)。 Python數(shù)據(jù)類型第二種:整數(shù)(int)。 Python數(shù)據(jù)類型第三種:浮點(diǎn)數(shù),浮點(diǎn)數(shù)的英文名是float,浮點(diǎn)數(shù)沒有簡寫。
    的頭像 發(fā)表于 02-23 14:58 ?5327次閱讀

    精度和雙精度浮點(diǎn)數(shù)的區(qū)別

    在計算機(jī)科學(xué)和數(shù)值計算中,浮點(diǎn)數(shù)是一種用于表示實(shí)數(shù)的數(shù)據(jù)類型。浮點(diǎn)數(shù)有兩種精度級別:單精度和雙精度。這兩種
    的頭像 發(fā)表于 12-13 10:55 ?1.3w次閱讀

    精度和雙精度浮點(diǎn)數(shù)的區(qū)別

    精度和雙精度是計算機(jī)中表示浮點(diǎn)數(shù)的兩種不同的精度。在計算機(jī)中,浮點(diǎn)數(shù)用來表示帶有小數(shù)部分的實(shí)數(shù),而單
    的頭像 發(fā)表于 12-15 10:25 ?6254次閱讀

    modbus浮點(diǎn)數(shù)怎么讀取

    Modbus是一種通信協(xié)議,常用于工業(yè)自動化系統(tǒng)中的設(shè)備之間的通信。它支持多種數(shù)據(jù)類型,包括整數(shù)、浮點(diǎn)數(shù)、字符串等。浮點(diǎn)數(shù)在工業(yè)領(lǐng)域中廣泛應(yīng)用,因此了解如何讀取和處理Modbus浮點(diǎn)數(shù)
    的頭像 發(fā)表于 12-28 14:38 ?8093次閱讀