Bagaimana saya bisa mengkonversi ganda ke nilai integer terdekat?

147

Bagaimana Anda mengonversi dobel menjadi int terdekat?

leora
sumber

Jawaban:

78

Gunakan Math.round(), mungkin dalam hubungannya denganMidpointRounding.AwayFromZero

misalnya:

Math.Round(1.2) ==> 1
Math.Round(1.5) ==> 2
Math.Round(2.5) ==> 2
Math.Round(2.5, MidpointRounding.AwayFromZero) ==> 3
nickf
sumber
6
Tidak akan Convert.ToInt32()melakukan hal yang sama, atau hanya menghapus semua setelah desimal?
The Muffin Man
208
Tidak benar-benar menghasilkan bilangan bulat, tetapi ganda.
gatopeich
13
@ Connie - tidak, itu dengan desain. Secara default, Math.Round akan membulatkan angka titik tengah (x + .5) ke nomor genap terdekat . Jika Anda menginginkan perilaku yang berbeda, Anda harus menentukannya melalui flag. msdn.microsoft.com/en-us/library/system.midpointrounding.aspx
nickf
6
Ya saya tidak pernah! :)
Ronnie
5
Dobel bukan Int.
Evgeni Nabokov
267
double d = 1.234;
int i = Convert.ToInt32(d);

Referensi

Menangani pembulatan seperti ini:

dibulatkan ke integer bertanda 32-bit terdekat. Jika nilainya setengah di antara dua bilangan bulat, bilangan genap dikembalikan; yaitu 4,5 dikonversi menjadi 4, dan 5,5 dikonversi menjadi 6.

John Sheehan
sumber
7
Jauh lebih baik Math.Roundkarena mengembalikan int yang diperlukan.
Keith
10
@ robert-koritnik. Tidak yakin mengapa itu "tidak valid". OP tidak menentukan aturan pembulatan yang disukai, dan "putaran .5 ke bahkan genap" adalah aturan standar dari jalan kembali. Pembulatan selalu memiliki efek statistik yang tidak diinginkan.
Keith
@Keith: Saya tidak tahu, tetapi saya selalu diajarkan untuk mengumpulkan x.5 tetapi saya bisa melihat alasan untuk melakukannya naik atau turun untuk statistik. Terima kasih untuk itu. PS Sudah jelas untuk melihat saya tidak dalam statistik, keuangan atau akuntansi di mana pembulatan semacam ini tampaknya menjadi default .
Robert Koritnik
3
"Selalu mengumpulkan memiliki efek statistik yang tidak diinginkan" - Itu benar-benar salah. Membulatkan .5 putaran ke atas tepat setengah angka - [0,.5)- turun dan tepat setengah angka - [.5,1)- naik. Membulatkan ke angka yang bahkan sedikit bias, karena (.5,1.5)[1.5,2.5]
membulatkan
11
@ JimBalter Karena nol tidak bulat, pembulatan setengah tidak menimbulkan bias positif, sehingga dikenal sebagai pembulatan asimetris. "Round half to even" tidak, jika distribusi Anda cukup dan pembulatan tidak bias baik angka genap atau tidak sama. Lihat setengah jalan membulatkan ikat .
sdds
36

Anda juga dapat menggunakan fungsi:

//Works with negative numbers now
static int MyRound(double d) {
  if (d < 0) {
    return (int)(d - 0.5);
  }
  return (int)(d + 0.5);
}

Tergantung pada arsitekturnya beberapa kali lebih cepat.

szymcio
sumber
Ini sempurna bagi saya karena Matematika. Putaran tidak berfungsi seperti yang saya inginkan.
Hanna
@ cullub ya itu. Itu mengkonversi d ganda yang telah ditambahkan ke dalamnya, menjadi bilangan bulat.
Darrell
Ini adalah metode yang saya sukai - bekerja dengan cara yang sangat sederhana. Jauh lebih pendek, dan lebih mudah dibaca daripada Math.Round (d, MidpointRounding.AwayFromZero) dan lebih ringkas daripada menggunakan pernyataan if untuk memilih apakah akan dibulatkan atau dibulatkan. DAN, sebenarnya mengembalikan integer pada akhirnya, bukan double
binderbound
3
Lihat @ Eternal21's komentar di bawah ini untuk perilaku aneh pada angka negatif (MyRound (-1.2) = 0)
Chris
2
Bagi siapa pun yang bertanya-tanya, masalah yang disebutkan oleh @Chris sekarang mungkin diselesaikan dengan memeriksa apakah nilainya negatif.
John Weisz
14
double d;
int rounded = (int)Math.Round(d);

sumber
5

Saya tahu pertanyaan ini sudah lama, tetapi saya menemukannya dalam pencarian saya untuk jawaban atas pertanyaan serupa. Saya pikir saya akan membagikan tip yang sangat berguna yang telah diberikan kepada saya.

Saat mengonversi ke int, cukup tambahkan .5nilai Anda sebelum mengunduh. Karena downcasting intselalu turun ke angka yang lebih rendah (misalnya (int)1.7 == 1), jika nomor Anda .5atau lebih tinggi, menambahkan .5akan membawanya ke nomor berikutnya dan downcast Anda intharus mengembalikan nilai yang benar. (mis. (int)(1.8 + .5) == 2)

Trent
sumber
13
Masalahnya adalah jika Anda mencoba mengonversi nilai negatif seperti itu. Misalnya -1,25 akan berakhir sama dengan 0 (-1,25 + 0,5 = 0,75, dan sekali dilemparkan ke int itu 0). Jadi, Anda perlu mengurangi 0,5 dari nilai negatif.
Eternal21
Seseorang dapat menggunakan+ 0.5 * Math.Abs(d)
TaW
-1

Untuk Unity, gunakan Mathf.RoundToInt .

using UnityEngine;

public class ExampleScript : MonoBehaviour
{
    void Start()
    {
        // Prints 10
        Debug.Log(Mathf.RoundToInt(10.0f));
        // Prints 10
        Debug.Log(Mathf.RoundToInt(10.2f));
        // Prints 11
        Debug.Log(Mathf.RoundToInt(10.7f));
        // Prints 10
        Debug.Log(Mathf.RoundToInt(10.5f));
        // Prints 12
        Debug.Log(Mathf.RoundToInt(11.5f));

        // Prints -10
        Debug.Log(Mathf.RoundToInt(-10.0f));
        // Prints -10
        Debug.Log(Mathf.RoundToInt(-10.2f));
        // Prints -11
        Debug.Log(Mathf.RoundToInt(-10.7f));
        // Prints -10
        Debug.Log(Mathf.RoundToInt(-10.5f));
        // Prints -12
        Debug.Log(Mathf.RoundToInt(-11.5f));
    }
}

Sumber

public static int RoundToInt(float f) { return (int)Math.Round(f); }
zwcloud
sumber
Q tidak menyebutkan atau menandai Unity.
XenoRo
@XenoRo Saya menjawab pertanyaan lama ini bagi mereka yang mencari jawaban yang sama ketika menggunakan Unity.
zwcloud
2
Anda dapat menjawab pertanyaan Anda sendiri untuk berbagi pengetahuan. Buat pertanyaan terpisah khusus untuk API (dalam hal ini Persatuan) dalam kasus seperti ini. Jawaban harus sesuai dengan pertanyaan. Kalau tidak, mungkin ada jawaban di sini untuk setiap C # API tunggal dengan fungsi pembulatan.
XenoRo
-2

Saya sedang mengembangkan kalkulator ilmiah yang menampilkan tombol Int. Saya telah menemukan yang berikut ini adalah solusi sederhana dan andal:

double dblInteger;
if( dblNumber < 0 )
   dblInteger = Math.Ceiling(dblNumber);
else
   dblInteger = Math.Floor(dblNumber);

Math.Round kadang-kadang menghasilkan hasil yang tidak terduga atau tidak diinginkan, dan konversi eksplisit ke integer (melalui gips atau Convert.ToInt ...) sering menghasilkan nilai yang salah untuk angka presisi yang lebih tinggi. Metode di atas tampaknya selalu berhasil.

Mark Jones
sumber
2
bukankah ini menjumlahkan semua negatif dan mengumpulkan semua angka positif? Itu belum tentu bilangan bulat "paling neaerest".
Tim Pohlmann
ini bukan nomor terdekat.
Samer Aamar
1
Diberikan 1,99, ini mengembalikan 1,0.
Jon Schneider