一隻太平洋睡鯊 发表于 2021-12-5 13:09:00

浮點數打印與型態轉換問題

本帖最后由 一隻太平洋睡鯊 于 2021-12-5 13:13 编辑

1.
#include <stdio.h>

int main()
{
    int x = 100 ;
    float y = 100.001 ;
    float a = (float)x ;
    int b = (int)y ;
    printf("%d\n", x) ;
    printf("%6.3f\n", y) ;
    printf("%6.3f\n", a) ;
    printf("%d\n", b) ;
    return 0 ;
}
這是我在讀的教材中的範例
我想知道%6.3f中"6.3"的涵義
是不是指總共6個位數,並且小數點後面3個位數?
(試了%f和%6f會打印出100.000999,但如果%6.2f會打印出100.00)

2.
已有變數可以型態轉換嗎?
這個章節是型態轉換,但是比如
    int x = 100 ;
    float y = 100.001 ;
    float x = (float)x ;
    int y = (int)y ;
是不行的,是不是要用其他的語法或代碼?

傻眼貓咪 发表于 2021-12-5 13:21:38

%6.2f 确实只是打印 100.00 啊(只保留小数点后 2 位,不是吗?)

傻眼貓咪 发表于 2021-12-5 13:24:53

本帖最后由 傻眼貓咪 于 2021-12-5 13:32 编辑

%6.2f 表示总长为 6 位,小数点后保留 2 位

100.001 = 100.00 (包括小点,长度共 6 位)
12.34 = 空格 12.34 (包括空格+小点,长度共 6 位)

一隻太平洋睡鯊 发表于 2021-12-5 19:15:27

傻眼貓咪 发表于 2021-12-5 13:24
%6.2f 表示总长为 6 位,小数点后保留 2 位

100.001 = 100.00 (包括小点,长度共 6 位)


那麼
100.001
不是等於有7位?(那不會變成7.3...?

12.34 = 空格 12.34 (包括空格+小点,长度共 6 位)
??? 空格...?

傻眼貓咪 发表于 2021-12-5 19:18:42

一隻太平洋睡鯊 发表于 2021-12-5 19:15
那麼
100.001
不是等於有7位?(那不會變成7.3...?


你可以试试:#include <bits/stdc++.h>
using namespace std;

int main(){
        double a = 123.45;
        printf("%20.1lf", a); // 这里故意放 20位
}

傻眼貓咪 发表于 2021-12-5 19:22:49

一隻太平洋睡鯊 发表于 2021-12-5 19:15
那麼
100.001
不是等於有7位?(那不會變成7.3...?


如果你想全部 100.001 都打印出来,确实应该放 %7.3f

一隻太平洋睡鯊 发表于 2021-12-5 19:38:21

傻眼貓咪 发表于 2021-12-5 19:22
如果你想全部 100.001 都打印出来,确实应该放 %7.3f

這樣啊!
那麼"%6.3f"和"%7.3f"如果都能夠打印一樣的內容,那6、7數字的意義究竟...?
剛剛試了一下,前面放0~5,都打印出一模一樣的東西,這樣不是好像只有".3"具有意義?

傻眼貓咪 发表于 2021-12-5 19:48:47

一隻太平洋睡鯊 发表于 2021-12-5 19:38
這樣啊!
那麼"%6.3f"和"%7.3f"如果都能夠打印一樣的內容,那6、7數字的意義究竟...?
剛剛試了一下,前 ...

因为其实%7.3f有两个部分 7 和 .3f 部分,其真正构造是 %[width][.precision]specifier
width 表示打印总长度
precision 表示打印小数点后几位

注:7 和 .3f 不同意思

傻眼貓咪 发表于 2021-12-5 19:53:16

一隻太平洋睡鯊 发表于 2021-12-5 19:38
這樣啊!
那麼"%6.3f"和"%7.3f"如果都能夠打印一樣的內容,那6、7數字的意義究竟...?
剛剛試了一下,前 ...

#include <bits/stdc++.h>
using namespace std;

int main(){
        float a = 12.34; // 当长度小于 7 时
        printf("%6.3f\n", a); // 明显看出差别
        printf("%7.3f\n", a); // 明显看出差别
       
        float b = 12345.678; // 当长度超于 7 时
        printf("%6.3f\n", b); // 没有差别
        printf("%7.3f\n", b); // 没有差别
}

一隻太平洋睡鯊 发表于 2021-12-5 19:58:21

傻眼貓咪 发表于 2021-12-5 19:48
因为其实%7.3f有两个部分 7 和 .3f 部分,其真正构造是 %[.precision]specifier
...

%[.precision]specifier
原來%後面可以放這麼多東西
f應該是specifier吧
那如果.3前面是7的時候,7就是裡面的
但前面是7以下的數目時,是不是就變成不是代表?
而是...?(我現在還沒學到這是啥...

另外第二個問題呢,同一個變數的型態轉換的問題{:10_309:}

傻眼貓咪 发表于 2021-12-5 20:03:27

一隻太平洋睡鯊 发表于 2021-12-5 19:58
%[.precision]specifier
原來%後面可以放這麼多東西
f應該是specifier吧


可以放很多东西,主要是看你想打印什么样子,全部可以自定义
关于 flags 也可以是空格 或 + 或 - 或 # 或 0,你可以试试网络查找关于 printf(),有很详细关于这点说明

傻眼貓咪 发表于 2021-12-5 20:06:02

一隻太平洋睡鯊 发表于 2021-12-5 19:58
%[.precision]specifier
原來%後面可以放這麼多東西
f應該是specifier吧


关于 flags

zhsguitar 发表于 2021-12-5 20:15:55

{:10_257:}{:10_257:}学习一下

一隻太平洋睡鯊 发表于 2021-12-5 20:30:57

傻眼貓咪 发表于 2021-12-5 20:06
关于 flags

那單一變數型態轉換的問題呢?
還是這個我以後會學到?(我現在才剛開始學一些,看的一本書,剛開始真的好多問題...

tianlai7266 发表于 2021-12-5 20:43:57

{:10_254:}

傻眼貓咪 发表于 2021-12-5 21:13:35

一隻太平洋睡鯊 发表于 2021-12-5 20:30
那單一變數型態轉換的問題呢?
還是這個我以後會學到?(我現在才剛開始學一些,看的一本書

不明白,什么问题?

一隻太平洋睡鯊 发表于 2021-12-5 21:43:28

傻眼貓咪 发表于 2021-12-5 21:13
不明白,什么问题?

已有變數可以型態轉換嗎?
這個章節是型態轉換,但是比如\
    int x = 100 ;
    float y = 100.001 ;
    float x = (float)x ;
    int y = (int)y ;
是不行的,是不是要用其他的語法或代碼?

傻眼貓咪 发表于 2021-12-5 22:03:02

一隻太平洋睡鯊 发表于 2021-12-5 21:43
已有變數可以型態轉換嗎?
這個章節是型態轉換,但是比如\



不能重复定义变量,只能重新命名新变量,如:
#include <stdio.h>

int main(){
        int a = 3;
        float b = (float)a; // 当转换成其它类型时,请确保数据不会流失
        char c = (char)a; // 当转换成其它类型时,请确保数据不会流失
        return 0;
}

一隻太平洋睡鯊 发表于 2021-12-6 21:01:27

傻眼貓咪 发表于 2021-12-5 22:03
不能重复定义变量,只能重新命名新变量,如:

這樣啊!所以C語言不能改變既有變量的型態,說起來
我怎麼記得好像python是可以改變變量型態的?
關於這個你知道嗎?搞不好是我記錯了...

傻眼貓咪 发表于 2021-12-6 21:12:08

一隻太平洋睡鯊 发表于 2021-12-6 21:01
這樣啊!所以C語言不能改變既有變量的型態,說起來
我怎麼記得好像python是可以改變變量型態的?
關於 ...

没错,Python 对象类型没有固定的,随时可以改变。所以相对 Python 在执行代码速度上不如 C/C++ 快,每个程序语言都有各自的利弊。
页: [1]
查看完整版本: 浮點數打印與型態轉換問題