ฉันทำอะไรบางอย่างหายไปหรือเปล่า
var someNumber = 123.456;
someNumber = someNumber.toFixed(2);
alert(typeof(someNumber));
//alerts string
ทำไมไม่.toFixed()
กลับสตริง?
ฉันต้องการปัดเศษทศนิยมเป็น 2 หลัก
ฉันทำอะไรบางอย่างหายไปหรือเปล่า
var someNumber = 123.456;
someNumber = someNumber.toFixed(2);
alert(typeof(someNumber));
//alerts string
ทำไมไม่.toFixed()
กลับสตริง?
ฉันต้องการปัดเศษทศนิยมเป็น 2 หลัก
คำตอบ:
มันส่งกลับสตริงเพราะ 0.1 และอำนาจของมัน (ซึ่งใช้ในการแสดงเศษส่วนทศนิยม) จะไม่สามารถแทนได้ (อย่างน้อยก็ไม่ได้มีความแม่นยำเต็มรูปแบบ) ในระบบเลขทศนิยม
ตัวอย่างเช่น 0.1 คือ 0.100000000000000000055511151231257827021181583404541015625 จริง ๆ และ 0.01 คือจริง ๆ 0.01000000000000000000816681711721685132943093776702880859375 (ขอบคุณBigDecimal
สำหรับการพิสูจน์จุดของฉัน :-P)
ดังนั้น (ไม่มีทศนิยมทศนิยมหรือประเภทจำนวนตรรกยะ), เอาท์พุทมันเป็นสตริงเป็นวิธีเดียวที่จะได้รับมันถูกตัดให้แม่นยำที่จำเป็นสำหรับการแสดงผล
toFixed
เป็นฟังก์ชันการจัดรูปแบบซึ่งมีวัตถุประสงค์เพียงอย่างเดียวในการแปลงตัวเลขเป็นสตริงโดยทำการจัดรูปแบบโดยใช้จำนวนทศนิยมที่ระบุ เหตุผลที่ส่งคืนสตริงเนื่องจากควรส่งคืนสตริงและหากตั้งชื่อtoStringFixed
แทน OP จะไม่แปลกใจที่ผลลัพธ์ ปัญหาเดียวที่นี่คือ OP คาดว่ามันจะทำงานเหมือนMath.round
โดยไม่ปรึกษา JS อ้างอิง
Number.prototype.toFixed
เป็นฟังก์ชั่นที่ออกแบบมาเพื่อจัดรูปแบบตัวเลขก่อนพิมพ์ออกมา มันมาจากครอบครัวtoString
, และtoExponential
toPrecision
ในการปัดเศษตัวเลขคุณต้องทำดังนี้
someNumber = 42.008;
someNumber = Math.round( someNumber * 1e2 ) / 1e2;
someNumber === 42.01;
// if you need 3 digits, replace 1e2 with 1e3 etc.
// or just copypaste this function to your code:
function toFixedNumber(num, digits, base){
var pow = Math.pow(base||10, digits);
return Math.round(num*pow) / pow;
}
.
หรือถ้าคุณต้องการฟังก์ชั่น“ เหมือนพื้นเมือง ” คุณสามารถขยายต้นแบบ:
Number.prototype.toFixedNumber = function(digits, base){
var pow = Math.pow(base||10, digits);
return Math.round(this*pow) / pow;
}
someNumber = 42.008;
someNumber = someNumber.toFixedNumber(2);
someNumber === 42.01;
//or even hexadecimal
someNumber = 0xAF309/256 //which is af3.09
someNumber = someNumber.toFixedNumber(1, 16);
someNumber.toString(16) === "af3.1";
อย่างไรก็ตามโปรดจำไว้ว่าการสร้างมลพิษต้นแบบนั้นถือว่าไม่ดีเมื่อคุณเขียนโมดูลเนื่องจากโมดูลไม่ควรมีผลข้างเคียงใด ๆ ดังนั้นสำหรับโมดูลให้ใช้ฟังก์ชั่นเป็นครั้งแรก
type Number
รับรู้ฟังก์ชั่นนี้เป็น สิ่งนั้นคือ+(anyValue)
ส่งกลับตัวเลขเสมอ - เช่น +("45")
ผลตอบแทน45
, ผลตอบแทน+(new Number(42))
42
มันเหมือนกับฟังก์ชั่นการพิมพ์ที่แข็งแกร่ง ถ้าคุณทำนิสัยของมันคุณสามารถหลีกเลี่ยงข้อบกพร่องมาก :)
someNumber = Math.round( 42.008 * 1e2 ) / 1e2;
ไม่ได้ก็คือ42.01
~42.0099999999999980
เหตุผล: จำนวน42.01
ไม่มีอยู่และถูกปัดเศษเป็นจำนวนที่ใกล้ที่สุดที่มีอยู่ btw, หมายเลขพิสูจน์โดยtoPrecision(18)
เพื่อพิมพ์ด้วยตัวเลขที่เกี่ยวข้องทั้งหมด
ฉันได้แก้ไขปัญหานี้โดยเปลี่ยนสิ่งนี้:
someNumber = someNumber.toFixed(2)
...สำหรับสิ่งนี้:
someNumber = +someNumber.toFixed(2);
อย่างไรก็ตามการทำเช่นนี้จะแปลงตัวเลขเป็นสตริงและแยกวิเคราะห์อีกครั้งซึ่งจะมีผลกระทบอย่างมากต่อประสิทธิภาพ หากคุณใส่ใจกับประสิทธิภาพหรือความปลอดภัยของประเภทให้ตรวจสอบคำตอบอื่น ๆ เช่นกัน
someNumber = Math.round(someNumber * 1e2) / 1e2
! ดูคำตอบของฉันสำหรับวิธีการทั่วไปมากขึ้น
ทำไมไม่ใช้parseFloat
?
var someNumber = 123.456;
someNumber = parseFloat(someNumber.toFixed(2));
alert(typeof(someNumber));
//alerts number
ฉันแก้ไขมันด้วยการแปลงกลับเป็นตัวเลขโดยใช้Number()
ฟังก์ชันของ JavaScript
var x = 2.2873424;
x = Number(x.toFixed(2));
แน่นอนมันส่งคืนสตริง หากคุณต้องการปัดเศษตัวแปรตัวเลขให้ใช้ Math.round () แทน จุด toFixed คือการจัดรูปแบบตัวเลขที่มีจำนวนคงที่ของตำแหน่งทศนิยมสำหรับการแสดงผลให้กับผู้ใช้
คุณสามารถใช้ '+' เพื่อแปลงผลลัพธ์เป็นตัวเลข
var x = 22.032423;
x = +x.toFixed(2); // x = 22.03
สิ่งที่คุณคาดหวังให้มันกลับมาเมื่อมันควรจะจัดรูปแบบตัวเลข? หากคุณมีตัวเลขคุณไม่สามารถทำอะไรกับมันได้เพราะ2 == 2.0 == 2.00
อย่างนั้นเป็นต้นดังนั้นมันจะต้องเป็นสตริง
ในการจัดหาตัวอย่างว่าทำไมจึงต้องเป็นสตริง:
หากคุณฟอร์แมต 1.toFixed (2) คุณจะได้รับ '1.00'
สิ่งนี้ไม่เหมือนกับ 1 เนื่องจาก 1 ไม่มีทศนิยม 2 ตำแหน่ง
ฉันรู้ว่าจาวาสคริปต์ไม่ใช่ภาษาที่ใช้ในการแสดงแต่โอกาสที่คุณจะได้รับประสิทธิภาพที่ดีขึ้นสำหรับการปัดเศษถ้าคุณใช้บางสิ่งเช่น: roundValue = Math.round (ค่า * 100) * 0.01
เพราะการใช้หลักแสดงตัวเลขหรือไม่ หากคุณต้องการปัดเศษตัวเลขให้ใช้Math.round()
กับปัจจัย apropriate
'42'
เป็นตัวเลขเท่านั้น ... ซึ่งไม่ใช่ เพียงเพราะสตริงเกิดขึ้นกับมีตัวเลขเท่านั้นไม่ได้ทำให้มันเป็นตัวเลข นี่ไม่ใช่ PHP :-P
ต่อไปนี้เป็นรุ่นที่ทำงานได้มากขึ้นเล็กน้อยของคำตอบที่m93a
มีให้
const toFixedNumber = (toFixTo = 2, base = 10) => num => {
const pow = Math.pow(base, toFixTo)
return +(Math.round(num * pow) / pow)
}
const oneNumber = 10.12323223
const result1 = toFixedNumber(2)(oneNumber) // 10.12
const result2 = toFixedNumber(3)(oneNumber) // 10.123
// or using pipeline-operator
const result3 = oneNumber |> toFixedNumber(2) // 10.12