[英]C++ - cout prints quotient of two integers as zero
我使用ifstream
讀取了一個文件,我想用cout
來寫出已經讀取了多少文件(以百分比為單位)。
long length = 0, now = 0;
int i = 0;
double d = 0;
file.seekg( 0, std::ios::end );
length = file.teelg();
file.seekg( 0, std::ios::beg );
while ( std::getline( file, buffer ) ) {
now = file.teelg;
i = now / length * 100;
d = now / length * 100;
std::cout << length << " " // working
<< now << " " // working
<< ( now / length * 100 ) << " " // not working = 0
<< i << " " // not working = 0
<< d; // not working = 0
}
僅當now = length
告訴我它是100%
,但每隔一次它失敗並給我0
。 我可以想象,答案很簡單,如1*1
,但現在找不到解決方案。 我也嘗試過投射,也許是因為這是問題所在,但是當然沒有。
除非操作數之一是float
或double
,否則/
將進行整數除法並丟棄其余的數。
像這樣寫:
( (double)now / length * 100 )
如果length > now
那么now / length
以整數除法為零。 投放至第一。
將計算結果轉換為浮點數
i = (float)now / length * 100;
d = (float)now / length * 100;
本質上,如果將整數相除,則四舍五入到最接近的數字。 因此,您只能有0或1。然后乘以100。
或者,您可以這樣做:
i = 100 * now / length;
d = 100 * now / length;
將數字乘以100后,四舍五入。
試試(now * 100) / length
。 這是因為now / length
的結果轉換為int,所以它只能是0
或1
。
另外,為避免浮動除法,您也可以先相乘,然后除法:
(now * 100) / length
你的表情
( now / length * 100 )
從左到右求值,因此如下所示:
int tmp = now / length
int result = tmp * 100
因為 ...
5.6乘法運算符[expr.mul]
[...]對於整數操作數,/運算符產生代數商,其中任何小數部分都被舍棄[...]
...對於任何now < length
,結果將為零。
添加浮點轉換可以幫助:
5個表達式[expr] :
10 :許多期望算術或枚舉類型的操作數的二進制運算符都以類似的方式引起轉換並產生結果類型。 目的是產生一個通用類型,它也是結果的類型。 這種模式稱為通常的算術轉換,其定義如下:
- ...
- 如果一個操作數的類型為long double,則另一個應轉換為long double。
- 否則,如果其中一個操作數為double,則另一個應轉換為double。
- 否則,如果其中一個操作數為float,則另一個應轉換為float。
- ...
因此,總而言之,對於任何兩個基本操作數(或任何未重載的operator/
),如果一個操作數為浮點型,則另一個操作數也將轉換為浮點型:
float(now) / length * 100
...會將所有操作數轉換為float:
float tmp = float(now) / length
float result = tmp * 100.0f
但是,您也可以重新排列計算以不使用任何浮點數學運算:
i = 100*now / length;
d = 100*now / length
然后根據需要給出整數。
如果您想知道為什么這在數學上起作用:
100*now now
---------- = 100 * --------
length length
左側是您現在擁有的,右側是您擁有的。 兩者都是等效的,但是當涉及到有限的數據類型時,執行的順序就變得高度相關。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.