ฉันจะลบส่วนทศนิยมออกจากหมายเลข JavaScript ได้อย่างไร


218

ฉันมีผลลัพธ์ของการหารและฉันต้องการที่จะทิ้งส่วนทศนิยมของจำนวนผลลัพธ์

ฉันจะทำสิ่งนี้ได้อย่างไร

คำตอบ:


384

คุณสามารถใช้ ...

  • Math.trunc() (ตัดส่วนเศษส่วนดูด้านล่างด้วย)
  • Math.floor() (ปัดลง)
  • Math.ceil() (ปัดขึ้น)
  • Math.round() (ปัดเป็นจำนวนเต็มใกล้เคียงที่สุด)

... ขึ้นอยู่กับวิธีที่คุณต้องการลบทศนิยม

Math.trunc()ยังไม่รองรับทุกแพลตฟอร์ม (เช่น IE) แต่คุณสามารถใช้polyfillได้อย่างง่ายดายในระหว่างนี้

อีกวิธีหนึ่งในการตัดทอนส่วนที่มีการสนับสนุนแพลตฟอร์มที่ยอดเยี่ยมคือการใช้ตัวดำเนินการระดับบิต (.eg |0) ผลข้างเคียงของการใช้ตัวดำเนินการ bitwise กับตัวเลขคือมันจะถือว่าตัวถูกดำเนินการเป็นจำนวนเต็ม 32 บิตที่ลงนามแล้วดังนั้นการลบองค์ประกอบเศษส่วน โปรดทราบว่าสิ่งนี้จะทำให้ตัวเลขมีขนาดใหญ่กว่า 32 บิต


คุณอาจพูดถึงความไม่ถูกต้องของการปัดเศษทศนิยมด้วยเลขทศนิยม

ต้องอ่าน - อะไรทุกนักวิทยาศาสตร์คอมพิวเตอร์ควรรู้เกี่ยวกับจุดลอยเลขคณิต


29
เก็บไว้ในใจว่าMath.floor()จะเพิ่มค่าตัวเลขเมื่อจำนวนเป็นเชิงลบ ดังนั้นในขณะที่Math.floor(-1.2) -> -2 ( ดังกล่าวโดย @FloydPink ) จะยกเลิกการเป็นส่วนหนึ่งทศนิยมตามที่คาดไว้สำหรับทั้งเชิงบวกและเชิงลบหมายเลข Math.floor(1.2) -> 1parseInt(-1.2) -> -1
Paul T. Rawkeen

1
@ PaulT.Rawkeen คุณสามารถใช้ตัวดำเนินการ bitwise เพื่อวางส่วนทศนิยม แต่จำไว้ว่ามันจะตัดให้เหลือ 32 บิต
alex

2
ต่อไปนี้แสดงคำตอบนี้ไม่เสถียร:> (2.305*100)|0 > 230 > (2.3*100)|0 > 229
Jake

4
@Jake ผลลัพธ์ของ2.3*100ใน javascript คือ229.99999999999997ดังนั้นดูเหมือนว่าผู้ประกอบการระดับบิตทำงานอย่างถูกต้องในตัวอย่างของคุณ
Chad von Nau

มีวิธีแก้ปัญหาคล้ายกันกับ|0ที่ใช้จำนวนเต็ม 64 บิตหรือไม่?
Clint

49

นอกจากนี้คุณยังสามารถใช้ตัวดำเนินการบิตเพื่อตัดทศนิยม

เช่น

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 (~~)


2
อาจมีประสิทธิภาพเล็กน้อย แต่ฉันอยากจะแนะนำฟังก์ชั่น 'คณิตศาสตร์' เพราะสามารถอ่านได้มากกว่า
ashipj

โอกาสที่ว่าจะไม่ทำงานหากจำนวนเต็มไม่ได้แสดงเป็นจำนวนเต็ม 32 บิต ( stackoverflow.com/a/7488075/3655192 )
Hiroki

30

คุณสามารถทำได้

parseInt(a/b)

17
โปรดทราบว่าparseIntจะไม่สามารถทำงานได้อย่างน่าเชื่อถือสำหรับตัวเลขขนาดใหญ่เพราะมันจะทำงานโดยการแปลงอาร์กิวเมนต์เป็นสตริงเป็นครั้งแรกและสำหรับจำนวนมากผลลัพธ์จะใช้สัญกรณ์เอ็กซ์โปเนนเชียล ตัวอย่างเช่นvar n = 22222222222222222222222; parseInt(n);จะกลับมา2เพราะผลตอบแทนn.toString() 2.2222222222222223e+22

2
นอกจากนี้ยังไม่ได้ใช้สำหรับจุดประสงค์ของมันซึ่งก็คือการใช้ตัวเลขในสตริงและผลตอบแทนparseInt() Number
alex

22

คุณยังสามารถแสดงจำนวนตัวเลขหลังจากจุดทศนิยม (ที่นี่ 2 หลัก) โดยใช้รหัสต่อไปนี้:

var num = (15.46974).toFixed(2)
console.log(num) // 15.47
console.log(typeof num) // string


4
โปรดทราบว่า toFixed () จะส่งคืนสตริงไม่ใช่ตัวเลข developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
......

1
นี่เป็นคำตอบอย่างไรเมื่อ OP ขอให้ลบส่วนทศนิยม
Isaac

3
แม้ว่ามันจะส่งคืนสตริง แต่คุณสามารถใช้วิธี Number () เพื่อแก้ไขได้ .. Number ((15.46974) .toFixed (2))
iPzard

13

ใช้Math.round()ฟังก์ชั่น

Math.round(65.98) // will return 66 
Math.round(65.28) // will return 65

17
เพื่อความสมบูรณ์นี่เป็น JavaScript ธรรมดาไม่ใช่แบบสอบถาม
Dave Newton

1
$.round = Math.round;)
alex


6

ด้วย 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 และเบราว์เซอร์สมัยใหม่อื่น ๆ


2
รู้หรือไม่ว่ารูปแบบใดบ้างที่อนุญาตให้ตัดทอนเป็นตำแหน่งทศนิยม X มันจะไร้เดียงสาMath.trunc(value * Math.pow(10,x)) / Math.pow(10,x)หรือไม่ที่จะคิดว่ามันจะได้ผล?
jamiebarrow

2
เฮ้เจมี่ดูเหมือนว่าจะใช้งานได้กับกรณีส่วนใหญ่ แต่ก็มีความอ่อนไหวต่อจุดลอยตัว เช่นvalue = 2.3และจะกลับมาx = 2 2.29ฉันไม่มีข้อเสนอแนะที่ดีกว่า
Chad von Nau

สำหรับฉันแล้วมันดูเหมือนคำตอบที่ถูกต้อง ไม่มีการปัดเศษบนหรือล่าง ไม่มีปัญหากับจำนวนลบ เพียงแค่ทิ้งทศนิยม ตามคำถามที่ถามมา
Enrique Moreno Tent

2

หากคุณไม่สนใจเรื่องเสียงดังให้แปลงตัวเลขเป็นสตริงจากนั้นลบทุกอย่างหลังจากช่วงเวลารวมถึงจุด วิธีนี้ใช้งานได้ว่ามีทศนิยมหรือไม่

const sEpoch = ((+new Date()) / 1000).toString();
const formattedEpoch = sEpoch.split('.')[0];

1

toFixed จะทำตัวเหมือนกลม

สำหรับชั้นที่ชอบพฤติกรรมให้ใช้%:

var num = 3.834234;
var floored_num = num - (num % 1); // floored_num will be 3

2
ทำไมคุณถึงรู้สึกว่าสิ่งนี้ดีกว่าการใช้ Math.floor วิธีการแก้ปัญหาของคุณดูเหมือนซับซ้อนและช้าโดยไม่จำเป็น ฉันไม่ทราบว่า Math.floor ทำงานอย่างไร แต่ฉันคาดว่ามันจะได้รับการปรับให้เหมาะสมที่สุด นอกจากนี้ฉันสงสัยว่าโซลูชันของคุณอาจมีข้อผิดพลาดในการปัดเศษทศนิยมหรือไม่
Hans Roerdinkholder

1

นี่คือการบีบอัดในคำอธิบายโดยละเอียดด้วยความช่วยเหลือของข้อความด้านบน:

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


1

ตัวอย่างเช่น:

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  

ฉันไม่เห็นว่าทำไมคำตอบนี้ไม่มีความรุ่งโรจน์ใด ๆ มันทำงานได้สำหรับฉันและมันรวมเข้ากับมาตรฐานการตอบสนอง / JavaScript
cwiggo

0

สำหรับการปรับใช้ ES6 ให้ใช้สิ่งต่อไปนี้:

const millisToMinutesAndSeconds = (millis) => {
  const minutes = Math.floor(millis / 60000);
  const seconds = ((millis % 60000) / 1000).toFixed(0);
  return `${minutes}:${seconds < 10 ? '0' : ''}${seconds}`;
}

0

นี่คือสำหรับผู้ที่ต้องการป้องกันไม่ให้ผู้ใช้ป้อนตัวเลขทศนิยม

<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>

0

คุณสามารถใช้. toFixed (0) เพื่อลบส่วนทศนิยมที่สมบูรณ์หรือใส่ตัวเลขในอาร์กิวเมนต์ที่คุณต้องการให้มีการตัดทศนิยม

หมายเหตุ: toFixed จะแปลงตัวเลขเป็นสตริง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.