คุณจะแปลง double เป็น int ที่ใกล้ที่สุดได้อย่างไร
คุณจะแปลง double เป็น int ที่ใกล้ที่สุดได้อย่างไร
คำตอบ:
ใช้Math.round()
งานอาจใช้ร่วมกับMidpointRounding.AwayFromZero
เช่น:
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);
จัดการการปัดเศษเช่น:
ปัดเศษเป็นจำนวนเต็มแบบ 32 บิตที่ใกล้ที่สุด หากค่าอยู่ครึ่งทางระหว่างสองจำนวนเต็มจำนวนคู่จะถูกส่งคืน นั่นคือ 4.5 ถูกแปลงเป็น 4 และ 5.5 ถูกแปลงเป็น 6
Math.Round
มันจะส่งกลับ int ตามที่ต้องการ
[0,.5)
- ลงและครึ่งหนึ่งของตัวเลข - [.5,1)
- ขึ้น การปัดเศษเป็นเลขอคติเล็กน้อยแม้ในขณะที่มันปัดเศษ(.5,1.5)
เป็น 1 แต่[1.5,2.5]
เป็น 2
คุณยังสามารถใช้ฟังก์ชัน:
//Works with negative numbers now
static int MyRound(double d) {
if (d < 0) {
return (int)(d - 0.5);
}
return (int)(d + 0.5);
}
ขึ้นอยู่กับสถาปัตยกรรมนั้นเร็วขึ้นหลายเท่า
double d;
int rounded = (int)Math.Round(d);
ฉันรู้ว่าคำถามนี้เก่า แต่ฉันเจอในการค้นหาคำตอบของคำถามที่คล้ายกันของฉัน ฉันคิดว่าฉันจะแบ่งปันเคล็ดลับที่มีประโยชน์มากที่ฉันได้รับ
เมื่อแปลงเป็น int เพียงเพิ่ม.5
มูลค่าของคุณก่อนที่จะทำการดาวน์สตรีม ในฐานะที่เป็น downcasting จะint
เสมอลดลงไปจำนวนที่ต่ำกว่า (เช่น(int)1.7 == 1
) ถ้าจำนวนของคุณอยู่.5
หรือสูงกว่าการเพิ่ม.5
จะนำมันออกเป็นจำนวนถัดไปและเศร้าใจของคุณเพื่อint
จะกลับค่าที่ถูกต้อง (เช่น(int)(1.8 + .5) == 2
)
+ 0.5 * Math.Abs(d)
วิธีการในคำตอบอื่น ๆ โยนOverflowException
ถ้าค่าลอยอยู่นอกช่วง 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;
}
เพื่อความสามัคคีใช้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); }
ฉันกำลังพัฒนาเครื่องคิดเลขวิทยาศาสตร์ที่ใช้ปุ่ม Int ฉันพบว่าต่อไปนี้เป็นวิธีแก้ปัญหาที่ง่ายและเชื่อถือได้:
double dblInteger;
if( dblNumber < 0 )
dblInteger = Math.Ceiling(dblNumber);
else
dblInteger = Math.Floor(dblNumber);
บางครั้ง Math.Round จะสร้างผลลัพธ์ที่ไม่คาดคิดหรือไม่พึงประสงค์และการแปลงเป็นจำนวนเต็มอย่างชัดเจน (ผ่านทาง Cast หรือ Convert.ToInt ... ) มักจะสร้างค่าที่ไม่ถูกต้องสำหรับตัวเลขที่มีความแม่นยำสูงกว่า วิธีการข้างต้นดูเหมือนว่าจะทำงานได้เสมอ
Convert.ToInt32()
ทำแบบเดียวกันหรือจะตัดทุกอย่างหลังจากจุดทศนิยม?