Bir ikiliyi en yakın int'e nasıl dönüştürürsünüz?
Yanıtlar:
Math.round()
Muhtemelen ile birlikte kullanınMidpointRounding.AwayFromZero
Örneğin:
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);
Şu şekilde yuvarlama kolları:
en yakın 32 bitlik işaretli tam sayıya yuvarlanır. Değer iki tam sayının ortasındaysa, çift sayı döndürülür; yani 4.5, 4'e ve 5.5, 6'ya dönüştürülür.
Math.Round
Gerektiği gibi bir int döndürdüğü için çok daha iyi .
[0,.5)
- aşağı ve tam olarak sayıların yarısı - - yukarı yuvarlar [.5,1)
. (.5,1.5)
1'e ancak [1.5,2.5]
2'ye yuvarlanarak, hatta biraz önyargılı sayılara yuvarlama .
Ayrıca işlevi de kullanabilirsiniz:
//Works with negative numbers now
static int MyRound(double d) {
if (d < 0) {
return (int)(d - 0.5);
}
return (int)(d + 0.5);
}
Mimariye bağlı olarak birkaç kat daha hızlıdır.
double d;
int rounded = (int)Math.Round(d);
Bu sorunun eski olduğunu biliyorum, ancak benzer sorumun cevabını ararken karşılaştım. Bana verilen çok faydalı ipucunu paylaşacağımı düşündüm.
İnt'e dönüştürürken, .5
aşağı doğru tahmin etmeden önce değerinize eklemeniz yeterlidir . int
Aşağı doğru tahmin her zaman daha düşük sayıya düştüğü için (örneğin (int)1.7 == 1
), numaranız .5
veya daha yüksekse, eklemek .5
onu bir sonraki sayıya getirecek ve downcast'iniz int
doğru değeri döndürmelidir. (örneğin (int)(1.8 + .5) == 2
)
+ 0.5 * Math.Abs(d)
Diğer yanıtlardaki yöntemler OverflowException
, kayan değer Int aralığının dışındaysa atılır. 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;
}
Unity için Mathf.RoundToInt kullanın .
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); }
Int düğmesi sporu yapan bilimsel bir hesap makinesi geliştiriyorum. Aşağıdakilerin basit ve güvenilir bir çözüm olduğunu buldum:
double dblInteger;
if( dblNumber < 0 )
dblInteger = Math.Ceiling(dblNumber);
else
dblInteger = Math.Floor(dblNumber);
Math.Round bazen beklenmedik veya istenmeyen sonuçlar üretir ve tamsayıya açık dönüştürme (cast veya Convert.ToInt ... aracılığıyla) genellikle daha yüksek kesinlikli sayılar için yanlış değerler üretir. Yukarıdaki yöntem her zaman işe yarıyor gibi görünüyor.
Convert.ToInt32()
aynı şeyi yapmak, ya da sadece ondalık sonra her şeyi şerit geliyor?