Akankah ledakan sederhana berhasil? $ splitDec = meledak (".", $ desimal); $ splitDec [0] sekarang akan menjadi 1 dan splitDec [1] sekarang akan menjadi 25 dari contoh Anda.
Matt
@Matt split()sudah ditinggalkan.
alex
@alex ya, lupa. Sedang memikirkan javascript. berubah menjadi meledak.
Matt
@Matt, split sudah tidak digunakan lagi sejak PHP 5.3 dan sebenarnya menggunakan regex sebagai arg-nya, sedangkan explode membutuhkan string. explode () lebih disukai dalam kasus ini.
shelhamer
4
Ketahuilah bahwa explode(".",1.10);wil memberikan 1 dan 1, bukan 1 dan 10
Sebagai sampingan, intval()atau casting sederhana (int)mungkin lebih berkinerja daripadafloor()
Jason McCreary
1
Bagaimana floor menghitung negatif?
LanceH
@LanceH: Memang tidak, tetapi Anda dapat membuatnya menanganinya dengan mudah dengan tanda negatif.
Brad Christie
4
Jawaban ini sebenarnya tidak akurat kecuali Anda menambahkan putaran (). Kedengarannya bodoh, saya tahu, tapi ini ada hubungannya dengan aritmatika angka floating point tingkat rendah. Lihat di sini: stackoverflow.com/questions/3726721/php-math-precision
Matt James
Coba dengan 510.9, menghasilkan 0.89. Tapi tidak tahu kenapa.
Ketahuilah bahwa explode(".",1.10);wil memberikan 1 dan 1, bukan 1 dan 10
Michel
3
Ini memecah dan melempar peringatan tentang indeks yang tidak ditentukan, jika angka adalah integer atau tidak berisi bagian desimal.
Andreyco
1
Ini mengasumsikan bahwa nomor tersebut tidak akan berakhir diwakili dalam notasi ilmiah ketika dilemparkan ke string. Jika jumlahnya sangat besar atau sangat kecil maka ini tidak akan menjadi masalah dan metode ini akan rusak.
Yang ini tidak rusak jika angka tidak mengandung bagian desimal. Bagus!
Andreyco
Bagus karena ini menghasilkan dua bilangan bulat; daripada int dan float.
foochow
1
Ini mengasumsikan bahwa nomor tersebut tidak akan berakhir diwakili dalam notasi ilmiah ketika dilemparkan ke string. Jika jumlahnya sangat besar atau sangat kecil maka ini tidak akan menjadi masalah dan metode ini akan rusak.
GordonM
18
Metode floor () tidak berfungsi untuk bilangan negatif. Ini berfungsi setiap saat:
Catatan: jika Anda melakukan ini, Anda setidaknya harus menggunakan round ($ decimal, 2); pertama untuk memastikan Anda hanya memiliki dua digit sebagai desimal. Tetapi Anda tidak dapat menggunakan ini jika Anda ingin memiliki matematika yang benar atau menangani uang.
Ulrik McArdle
0
Untuk mencegah desimal float ekstra (yaitu 50.85 - 50 memberikan 0.850000000852), dalam kasus saya, saya hanya perlu 2 desimal untuk sen uang.
Saya mengalami kesulitan menemukan cara untuk benar-benar memisahkan jumlah dolar dan jumlah setelah desimal. Saya pikir saya kebanyakan mengetahuinya dan berpikir untuk berbagi jika ada di antara kalian yang mengalami masalah
Jadi pada dasarnya...
jika harga adalah 1234.44 ... keseluruhan akan menjadi 1234 dan desimal menjadi 44 atau
jika harga 1234.01 ... keseluruhan akan menjadi 1234 dan desimal akan menjadi 01 atau
jika harga 1234.10 ... keseluruhan menjadi 1234 dan desimal menjadi 10
Dan seterusnya
$price =1234.44;
$whole = intval($price);// 1234
$decimal1 = $price - $whole;// 0.44000000000005 uh oh! that's why it needs... (see next line)
$decimal2 = round($decimal1,2);// 0.44 this will round off the excess numbers
$decimal = substr($decimal2,2);// 44 this removed the first 2 charactersif($decimal ==1){ $decimal =10;}// Michel's warning is correct...if($decimal ==2){ $decimal =20;}// if the price is 1234.10... the decimal will be 1...if($decimal ==3){ $decimal =30;}// so make sure to add these rules tooif($decimal ==4){ $decimal =40;}if($decimal ==5){ $decimal =50;}if($decimal ==6){ $decimal =60;}if($decimal ==7){ $decimal =70;}if($decimal ==8){ $decimal =80;}if($decimal ==9){ $decimal =90;}
echo 'The dollar amount is '. $whole .' and the decimal amount is '. $decimal;
Dalam hal ini mendapatkan keduanya $wholeAs?dan $decimaltidak bergantung pada yang lain. (Anda bisa mengambil 1 dari 3 keluaran secara independen.) Saya telah menunjukkan $wholeAsFloatdan $wholeAsIntkarenafloor() mengembalikan nomor tipe float meskipun nomor yang dikembalikan akan selalu utuh. (Ini penting jika Anda meneruskan hasilnya ke parameter fungsi petunjuk tipe.)
Saya ingin ini membagi jumlah floating point dari jam / menit, misalnya 96.25, menjadi jam dan menit secara terpisah untuk instance DateInterval sebagai 96 jam 15 menit. Saya melakukan ini sebagai berikut:
split()
sudah ditinggalkan.explode(".",1.10);
wil memberikan 1 dan 1, bukan 1 dan 10Jawaban:
Kemudian bandingkan dengan 1/4, 1/2, 3/4, dll.
Dalam kasus angka negatif, gunakan ini:
The
$returnUnsigned
berhenti dari membuat -1,25 ke -1 & -0,25sumber
intval()
atau casting sederhana(int)
mungkin lebih berkinerja daripadafloor()
Kode ini akan membaginya untuk Anda:
dengan $ whole adalah bilangan bulat dan $ decimal akan memiliki digit setelah koma desimal.
sumber
explode(".",1.10);
wil memberikan 1 dan 1, bukan 1 dan 10Hanya untuk menjadi berbeda :)
CodePad .
Sebagai keuntungan tambahan, ini hanya akan dibagi dimana kedua sisinya terdiri dari angka.
sumber
Metode floor () tidak berfungsi untuk bilangan negatif. Ini berfungsi setiap saat:
... juga berfungsi untuk negatif (kode sama, nomor berbeda):
sumber
cara singkat (gunakan floor dan fmod)
lalu bandingkan $ desimal dengan 0, .25, .5, atau .75
sumber
(a % 1)
DAN menangani angka negatif dengan baik.Tuang sebagai int dan kurangi
Atau hanya untuk mendapatkan desimal untuk perbandingan
sumber
Ada juga fungsi fmod, yang dapat digunakan: fmod ($ my_var, 1) akan mengembalikan hasil yang sama, tetapi terkadang dengan kesalahan putaran kecil.
sumber
PHP 5,4+
sumber
Ini cara yang saya gunakan:
sumber
Metode Brad Christie pada dasarnya benar tetapi dapat ditulis lebih ringkas.
Ini sama dengan metodenya tetapi lebih singkat dan semoga hasilnya lebih mudah dipahami.
sumber
sumber
Jika Anda dapat mengandalkannya selalu memiliki 2 tempat desimal, Anda dapat menggunakan operasi string:
Tidak tahu kinerja tetapi untuk kasus sederhana saya ini jauh lebih baik ...
sumber
Untuk mencegah desimal float ekstra (yaitu 50.85 - 50 memberikan 0.850000000852), dalam kasus saya, saya hanya perlu 2 desimal untuk sen uang.
sumber
Saya mengalami kesulitan menemukan cara untuk benar-benar memisahkan jumlah dolar dan jumlah setelah desimal. Saya pikir saya kebanyakan mengetahuinya dan berpikir untuk berbagi jika ada di antara kalian yang mengalami masalah
Jadi pada dasarnya...
jika harga adalah 1234.44 ... keseluruhan akan menjadi 1234 dan desimal menjadi 44 atau
jika harga 1234.01 ... keseluruhan akan menjadi 1234 dan desimal akan menjadi 01 atau
jika harga 1234.10 ... keseluruhan menjadi 1234 dan desimal menjadi 10
Dan seterusnya
sumber
Tidak terlihat modulus sederhana di sini ...
Dalam hal ini mendapatkan keduanya
$wholeAs?
dan$decimal
tidak bergantung pada yang lain. (Anda bisa mengambil 1 dari 3 keluaran secara independen.) Saya telah menunjukkan$wholeAsFloat
dan$wholeAsInt
karenafloor()
mengembalikan nomor tipe float meskipun nomor yang dikembalikan akan selalu utuh. (Ini penting jika Anda meneruskan hasilnya ke parameter fungsi petunjuk tipe.)Saya ingin ini membagi jumlah floating point dari jam / menit, misalnya 96.25, menjadi jam dan menit secara terpisah untuk instance DateInterval sebagai 96 jam 15 menit. Saya melakukan ini sebagai berikut:
Saya tidak peduli tentang detik dalam kasus saya.
sumber
sumber