[英]How can I prevent floats and doubles from getting truncated in Java and C?
[英]How can I fix my floats being rounded down to doubles?
我知道在C語言中默認情況下,當您聲明浮點數時,它會自動保存為double值;如果希望將其保存為浮點數,則必須這樣聲明它
float x = 0.11f
但是如果我的x值來自scanf怎么辦? 如何做到在打印時不會四舍五入? 這是我的代碼順便說一句,謝謝您的幫助。
#include <stdio.h>
int main() {
float number = 0;
float comparison;
do{
printf("\nEnter a number: ");
scanf("%f", &comparison);
if(comparison > number) {
number = comparison;
}
}while(comparison > 0);
printf("The largest number enteres was: %f\n\n", number);
}
如果我的x值來自scanf怎么辦? 如何做到在打印時不會四舍五入?
使用%f
指令的scanf
將讀取輸入並將其轉換為float
(而不是double
)。 如果匹配的文本與精確地表示為float
的數字不對應,則在此階段將進行四舍五入。 沒有替代。
當你傳遞float類型的一個參數printf()
進行打印, 它將被提升到鍵入double
。 該功能的簽名要求這樣做。 但是double
類型可以完全表示float
類型的所有值 ,因此此升級不涉及任何舍入。 printf
對%f
指令的處理與此自動升級保持一致:對應的(升級的)參數的類型應為double
。
確切地再現輸入有多種途徑,具體取決於您願意對該輸入施加什么約束。 最通用的方法是以字符串形式讀取,存儲和打印數據,盡管這有其復雜性。
如果您願意對支持逐字復制的最大十進制范圍和精度進行限制,則可以通過在printf
字段指令中指定精度來將輸出舍入為與輸入相同的表示形式:
float f;
scanf("%f", &f);
printf("%f %.2f %5.2f\n", f, f, f);
如果要使用內置的浮點格式,並且還避免附加尾隨零,則可能需要像這樣的顯式精度或%g
指令:
printf("%f %g\n", f, f);
還涉及其他替代方法,例如創建定點或任意精度的十進制數據類型,以及用於讀寫數據類型的適當函數。 我認為這超出了您目前感興趣的范圍。
注意 :“ double”是“ double precision”的縮寫,與單精度“ float”相反。 就存儲和表示能力而言,前者是較大的類型。 在實際的實現中,從float
到double
從來沒有任何“舍入”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.