Apa penentu format yang benar untuk double
dalam printf? Apakah %f
atau %lf
? Saya yakin itu %f
, tetapi saya tidak yakin.
#include <stdio.h>
int main()
{
double d = 1.4;
printf("%lf", d); // Is this wrong?
}
&"%f"
adalah (atau paling tidak satu) format yang benar untuk sebuah double. Tidak ada *tidak ada format untuk float
, karena jika Anda mencoba untuk melewatkan float
ke printf
, maka float
akan dipromosikan menjadi double
sebelum printf
menerimanya1. "%lf"
juga dapat diterima di bawah standar saat ini - l
ditentukan tidak memiliki efek jika diikuti oleh penentu konversi f
(antara lain).
Perhatikan bahwa ini adalah salah satu tempat di mana string format printf
berbeda secara substansial dari string format scanf
(dan fscanf
, dll.). Untuk output, anda akan melewatkan nilai, yang akan dipromosikan dari float
ke double
ketika dilewatkan sebagai parameter variadic. Untuk input, Anda akan melewatkan pointer, yang tidak dipromosikan, jadi Anda harus memberitahu scanf
apakah Anda ingin membaca float
atau double
, jadi untuk scanf
, %f
berarti Anda ingin membaca float
dan %lf
berarti Anda ingin membaca double
(dan, untuk apa yang berharga, untuk long double
, Anda menggunakan %Lf
baik untuk printf
atau scanf
).
Mengingat C99 standar (yaitu, N1256 draft), aturan tergantung pada fungsi jenis: fprintf (printf, sprintf, ...) atau scanf.
Berikut ini adalah bagian-bagian yang relevan diambil:
Pengantar
edisi kedua Ini membatalkan dan menggantikan edisi pertama, ISO/IEC 9899:1990, sebagaimana telah diubah dan diperbaiki oleh ISO/IEC 9899/COR1:1994, ISO/IEC 9899/AMD1:1995, dan ISO/IEC 9899/COR2:1996. perubahan Besar dari edisi sebelumnya meliputi:
%lf
conversion specifier diperbolehkan dalamprintf
7.19.6.1 Yang
fprintf
fungsi7 panjang pengubah dan artinya adalah:
l (ell) Menentukan bahwa (...) tidak memiliki pengaruh pada berikut, A, e, E, f, F, g, atau G conversion specifier.
L Menentukan bahwa berikut a, A, e, E, f, F, g, atau G conversion specifier berlaku untuk long double argumen.
Aturan yang sama yang ditetapkan untuk fprintf
melamar printf
, sprintf
dan fungsi yang sama.
7.19.6.2 Yang
fscanf
fungsi11 panjang pengubah dan artinya adalah:
l (ell) Menentukan bahwa (...) yang mengikuti a, A, e, E, f, F, g, atau G conversion specifier berlaku untuk argumen dengan tipe pointer untuk ganda;
L Menentukan bahwa berikut a, A, e, E, f, F, g, atau G konversi penspesifikasi berlaku untuk argumen dengan tipe pointer untuk long double.
12 konversi specifier dan artinya adalah: a,e,f,g Sesuai dengan opsional ditandatangani floating-point number, (...)
14 konversi specifier A, E, F, G, dan X juga berlaku dan berperilaku sama, masing-masing, a, e, f, g, dan x.
Cerita panjang pendek, untuk fprintf
berikut specifier dan sesuai jenis tertentu:
%f
-> ganda%Lf
-> long double.dan untuk fscanf
itu adalah:
%f
-> float%lf
-> ganda%Lf
-> long double.Ini bisa berupa %f
, %g
atau %e
tergantung pada bagaimana Anda ingin angka diformat. Lihat di sini untuk lebih jelasnya. Modifier l
diperlukan dalam scanf
dengan double
, tetapi tidak dalam printf
.
Yang benar printf
format ganda
ini %lf
, persis seperti yang anda digunakan. Ada's tidak ada yang salah dengan kode anda.
Format %lf
di printf
tidak didukung di tua (pra-C99) versi bahasa C yang dibuat dangkal "inkonsistensi" antara format specifier untuk double
dalam printf
dan scanf
. Yang dangkal inkonsistensi telah diperbaiki di C99.
Jadi di modern C itu masuk akal untuk memilih untuk menggunakan %f
dengan mengambang
, %lf
dengan double
dan %Lf
dengan long double
secara konsisten di kedua printf
dan scanf
.
%Lf
(perhatikan huruf kapital L
) adalah penentu format untuk long doubles.
Untuk doubles
biasa, baik %e
, %E
, %f
, %g
atau %G
bisa digunakan.