ฉันมีผลลัพธ์ของการหารและฉันต้องการที่จะทิ้งส่วนทศนิยมของจำนวนผลลัพธ์
ฉันจะทำสิ่งนี้ได้อย่างไร
ฉันมีผลลัพธ์ของการหารและฉันต้องการที่จะทิ้งส่วนทศนิยมของจำนวนผลลัพธ์
ฉันจะทำสิ่งนี้ได้อย่างไร
คำตอบ:
คุณสามารถใช้ ...
Math.trunc() (ตัดส่วนเศษส่วนดูด้านล่างด้วย)Math.floor() (ปัดลง)Math.ceil() (ปัดขึ้น) Math.round() (ปัดเป็นจำนวนเต็มใกล้เคียงที่สุด)... ขึ้นอยู่กับวิธีที่คุณต้องการลบทศนิยม
Math.trunc()ยังไม่รองรับทุกแพลตฟอร์ม (เช่น IE) แต่คุณสามารถใช้polyfillได้อย่างง่ายดายในระหว่างนี้
อีกวิธีหนึ่งในการตัดทอนส่วนที่มีการสนับสนุนแพลตฟอร์มที่ยอดเยี่ยมคือการใช้ตัวดำเนินการระดับบิต (.eg |0) ผลข้างเคียงของการใช้ตัวดำเนินการ bitwise กับตัวเลขคือมันจะถือว่าตัวถูกดำเนินการเป็นจำนวนเต็ม 32 บิตที่ลงนามแล้วดังนั้นการลบองค์ประกอบเศษส่วน โปรดทราบว่าสิ่งนี้จะทำให้ตัวเลขมีขนาดใหญ่กว่า 32 บิต
คุณอาจพูดถึงความไม่ถูกต้องของการปัดเศษทศนิยมด้วยเลขทศนิยม
ต้องอ่าน - อะไรทุกนักวิทยาศาสตร์คอมพิวเตอร์ควรรู้เกี่ยวกับจุดลอยเลขคณิต
> (2.305*100)|0 > 230 > (2.3*100)|0 > 229
2.3*100ใน javascript คือ229.99999999999997ดังนั้นดูเหมือนว่าผู้ประกอบการระดับบิตทำงานอย่างถูกต้องในตัวอย่างของคุณ
|0ที่ใช้จำนวนเต็ม 64 บิตหรือไม่?
นอกจากนี้คุณยังสามารถใช้ตัวดำเนินการบิตเพื่อตัดทศนิยม
เช่น
var x = 9 / 2;
console.log(x); // 4.5
x = ~~x;
console.log(x); // 4
x = -3.7
console.log(~~x) // -3
console.log(x | 0) // -3
console.log(x << 0) // -3
การทำงานแบบบิตมีประสิทธิภาพมากกว่าฟังก์ชั่นคณิตศาสตร์ ตัวดำเนินการ double ไม่ใช่ bitwise ดูเหมือนว่าจะมีประสิทธิภาพสูงกว่าการดำเนินการx | 0และx << 0bitwise เล็กน้อยด้วยจำนวนเล็กน้อย
// 952 milliseconds
for (var i = 0; i < 1000000; i++) {
(i * 0.5) | 0;
}
// 1150 milliseconds
for (var i = 0; i < 1000000; i++) {
(i * 0.5) << 0;
}
// 1284 milliseconds
for (var i = 0; i < 1000000; i++) {
Math.trunc(i * 0.5);
}
// 939 milliseconds
for (var i = 0; i < 1000000; i++) {
~~(i * 0.5);
}
สิ่งที่ควรสังเกตก็คือตัวดำเนินการ bitwise not จะมีความสำคัญเหนือกว่าการดำเนินการทางคณิตศาสตร์ดังนั้นคุณอาจต้องล้อมรอบการคำนวณด้วยวงเล็บเพื่อให้ได้ผลลัพธ์ที่ต้องการ:
x = -3.7
console.log(~~x * 2) // -6
console.log(x * 2 | 0) // -7
console.log(x * 2 << 0) // -7
console.log(~~(x * 2)) // -7
console.log(x * 2 | 0) // -7
console.log(x * 2 << 0) // -7
ข้อมูลเพิ่มเติมเกี่ยวกับ double bitwise not operator สามารถดูได้ที่Double bitwise NOT (~~)
คุณสามารถทำได้
parseInt(a/b)
parseIntจะไม่สามารถทำงานได้อย่างน่าเชื่อถือสำหรับตัวเลขขนาดใหญ่เพราะมันจะทำงานโดยการแปลงอาร์กิวเมนต์เป็นสตริงเป็นครั้งแรกและสำหรับจำนวนมากผลลัพธ์จะใช้สัญกรณ์เอ็กซ์โปเนนเชียล ตัวอย่างเช่นvar n = 22222222222222222222222; parseInt(n);จะกลับมา2เพราะผลตอบแทนn.toString() 2.2222222222222223e+22
parseInt() Number
คุณยังสามารถแสดงจำนวนตัวเลขหลังจากจุดทศนิยม (ที่นี่ 2 หลัก) โดยใช้รหัสต่อไปนี้:
var num = (15.46974).toFixed(2)
console.log(num) // 15.47
console.log(typeof num) // string
ใช้Math.round()ฟังก์ชั่น
Math.round(65.98) // will return 66
Math.round(65.28) // will return 65
$.round = Math.round;)
Math.round()ใช้
(คำตอบของอเล็กซ์ดีกว่าฉันตั้งสมมติฐาน :)
ด้วย ES2015 สามารถใช้Math.trunc ()ได้
Math.trunc(2.3) // 2
Math.trunc(-2.3) // -2
Math.trunc(22222222222222222222222.3) // 2.2222222222222223e+22
Math.trunc("2.3") // 2
Math.trunc("two") // NaN
Math.trunc(NaN) // NaN
ไม่รองรับ IE11 หรือต่ำกว่า แต่ทำงานใน Edge และเบราว์เซอร์สมัยใหม่อื่น ๆ
Math.trunc(value * Math.pow(10,x)) / Math.pow(10,x)หรือไม่ที่จะคิดว่ามันจะได้ผล?
value = 2.3และจะกลับมาx = 2 2.29ฉันไม่มีข้อเสนอแนะที่ดีกว่า
หากคุณไม่สนใจเรื่องเสียงดังให้แปลงตัวเลขเป็นสตริงจากนั้นลบทุกอย่างหลังจากช่วงเวลารวมถึงจุด วิธีนี้ใช้งานได้ว่ามีทศนิยมหรือไม่
const sEpoch = ((+new Date()) / 1000).toString();
const formattedEpoch = sEpoch.split('.')[0];
toFixed จะทำตัวเหมือนกลม
สำหรับชั้นที่ชอบพฤติกรรมให้ใช้%:
var num = 3.834234;
var floored_num = num - (num % 1); // floored_num will be 3
นี่คือการบีบอัดในคำอธิบายโดยละเอียดด้วยความช่วยเหลือของข้อความด้านบน:
1. Math.trunc ():มันถูกใช้เพื่อลบตัวเลขเหล่านั้นซึ่งตามด้วยจุด มันแปลงโดยปริยาย แต่ไม่รองรับใน IE
ตัวอย่าง:
Math.trunc (10.5) // 10
Math.trunc (-10.5) // -10
ทางเลือกอื่น ๆ : การใช้ตัวดำเนินการระดับบิตมินิไม่:
ตัวอย่าง:
x = 5.5
~~ x // 5
2. Math.floor ():มันถูกใช้เพื่อให้ค่าจำนวนเต็มขั้นต่ำที่เป็นไปได้ รองรับทุกเบราว์เซอร์
ตัวอย่าง:
Math.floor (10.5) // 10
Math.floor (-10.5) // -11
3. Math.ceil ():มันถูกใช้เพื่อให้ค่าจำนวนเต็มสูงสุดที่เป็นไปได้ รองรับทุกเบราว์เซอร์
ตัวอย่าง:
Math.ceil (10.5) // 11
Math.ceil (-10.5) // -10
4. Math.round ():มันจะถูกปัดเศษเป็นจำนวนเต็มที่ใกล้เคียงที่สุด รองรับทุกเบราว์เซอร์
ตัวอย่าง:
Math.round (10.5) // 11
Math.round (-10.5) // -10
Math.round (10.49) // 10
Math.round (-10.51) // -11
ตัวอย่างเช่น:
var x = 9.656;
x.toFixed(0); // returns 10
x.toFixed(2); // returns 9.66
x.toFixed(4); // returns 9.6560
x.toFixed(6); // returns 9.656000
หรือ
parseInt("10"); // returns 10
parseInt("10.33"); // returns 10
parseInt("10 20 30"); // returns 10
parseInt("10 years"); // returns 10
parseInt("years 10"); // returns NaN
สำหรับการปรับใช้ ES6 ให้ใช้สิ่งต่อไปนี้:
const millisToMinutesAndSeconds = (millis) => {
const minutes = Math.floor(millis / 60000);
const seconds = ((millis % 60000) / 1000).toFixed(0);
return `${minutes}:${seconds < 10 ? '0' : ''}${seconds}`;
}
นี่คือสำหรับผู้ที่ต้องการป้องกันไม่ให้ผู้ใช้ป้อนตัวเลขทศนิยม
<input id="myInput" onkeyup="doSomething()" type="number" />
<script>
function doSomething() {
var intNum = $('#myInput').val();
if (!Number.isInteger(intNum)) {
intNum = Math.round(intNum);
}
console.log(intNum);
}
</script>
คุณสามารถใช้. toFixed (0) เพื่อลบส่วนทศนิยมที่สมบูรณ์หรือใส่ตัวเลขในอาร์กิวเมนต์ที่คุณต้องการให้มีการตัดทศนิยม
หมายเหตุ: toFixed จะแปลงตัวเลขเป็นสตริง
Math.floor()จะเพิ่มค่าตัวเลขเมื่อจำนวนเป็นเชิงลบ ดังนั้นในขณะที่Math.floor(-1.2) -> -2( ดังกล่าวโดย @FloydPink ) จะยกเลิกการเป็นส่วนหนึ่งทศนิยมตามที่คาดไว้สำหรับทั้งเชิงบวกและเชิงลบหมายเลขMath.floor(1.2) -> 1parseInt(-1.2) -> -1