Jawaban:
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
double d = 1.234;
int i = Convert.ToInt32(d);
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.
Math.Round
karena mengembalikan int yang diperlukan.
[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]
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.
double d;
int rounded = (int)Math.Round(d);
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 .5
nilai Anda sebelum mengunduh. Karena downcasting int
selalu turun ke angka yang lebih rendah (misalnya (int)1.7 == 1
), jika nomor Anda .5
atau lebih tinggi, menambahkan .5
akan membawanya ke nomor berikutnya dan downcast Anda int
harus mengembalikan nilai yang benar. (mis. (int)(1.8 + .5) == 2
)
+ 0.5 * Math.Abs(d)
Metode di jawaban lain melempar OverflowException
jika nilai float di luar kisaran Int. https://docs.microsoft.com/en-us/dotnet/api/system.convert.toint32?view=netframework-4.8#System_Convert_ToInt32_System_Single_
int result = 0;
try {
result = Convert.ToInt32(value);
}
catch (OverflowException) {
if (value > 0) result = int.MaxValue;
else result = int.Minvalue;
}
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));
}
}
public static int RoundToInt(float f) { return (int)Math.Round(f); }
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.
Convert.ToInt32()
melakukan hal yang sama, atau hanya menghapus semua setelah desimal?