จัดรูปแบบตัวเลขเป็นทศนิยม 2 ตำแหน่ง


154

ฉันต้องการที่จะรู้ว่าฉันจะส่งออกจำนวนที่มีทศนิยม 2 ตำแหน่งโดยไม่ต้องปัดเศษจำนวนเดิมได้อย่างไร

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

2229,999 -> 2229,99

ฉันได้ลองแล้ว:

FORMAT(2229.999, 2)
CONVERT(2229.999, DECIMAL(4,2))

ดูเหมือนว่าคุณกำลังพยายามใช้คำสั่งเพื่อตัดทอน ทำไมไม่ใช้เพียงฟังก์ชั่นที่สร้างขึ้นมา?
Fallenreaper

DECIMAL(6,2))คุณไม่จำเป็นต้องทศนิยมที่จะ 6- ความแม่นยำ (จำนวนหลักทั้งหมด) และ 2 คือจำนวนหลักหลังทศนิยม?
user5249203

คำตอบ:


82

คุณต้องการใช้TRUNCATEคำสั่ง

https://dev.mysql.com/doc/refman/8.0/en/mathematical-functions.html#function_truncate


9
ตัดทอน "ปัดเศษ" ลงเสมอ 1.999 ที่ตัดให้เหลือ 2 DP จะเท่ากับ 1.99 โดยที่ 2.00 จะถูกต้องทางคณิตศาสตร์มากขึ้น หากนั่นไม่ใช่ปัญหาให้ตัดทอนค่าปรับ แต่คุณควรระวัง
GordonM

ฉันเห็นด้วยกับ GordonM และ TRUNCATE ควรใช้กับสาเหตุโดยเฉพาะอย่างยิ่งกับจำนวนจุดลอยตัว!
Nebulosar

364

เมื่อจัดรูปแบบตัวเลขทศนิยม 2 ตำแหน่งคุณมีสองตัวเลือกและTRUNCATE ROUNDคุณกำลังมองหาTRUNCATEฟังก์ชั่น

ตัวอย่าง:

โดยไม่ต้องปัดเศษ

TRUNCATE(0.166, 2)
-- will be evaluated to 0.16

TRUNCATE(0.164, 2)
-- will be evaluated to 0.16

เอกสาร: http://www.w3resource.com/mysql/mathematical-functions/mysql-truncate-function.php

ด้วยการปัดเศษ:

ROUND(0.166, 2)
-- will be evaluated to 0.17

ROUND(0.164, 2)
-- will be evaluated to 0.16

เอกสาร: http://www.w3resource.com/mysql/mathematical-functions/mysql-round-function.php


2
คุณควรใช้truncateรูปแบบตัวเลขเมื่อคุณต้องการให้มีการปัดเศษตัวเลข เธอทำให้มันชัดเจนในคำถามที่ว่านี่คือสิ่งที่เธอต้องการจะทำ มีหลายวิธีในการปัดเศษ (พื้น, เพดาน, ห่างจากศูนย์, ไปยังศูนย์, ครึ่งหนึ่ง, ครึ่งหนึ่ง, ครึ่งคู่) เหมาะสมในบริบทที่แตกต่างกัน
กีบ

16
ใช่ แต่ฉันเห็นหลายคนพบว่าคำตอบของฉันมีประโยชน์หรือบางทีพวกเขาพบคำถามนี้เมื่อพวกเขากำลังมองหาคำสั่ง ROUND ฉันจะปล่อยให้มันเป็นอย่างที่มันเป็น
jmarceli

"คุณไม่ควรใช้ TRUNCATE เพื่อจัดรูปแบบตัวเลขเพราะคุณจะสูญเสียตัวเลขที่ถูกตัดทอน" => นั่นคือจุดตัดทอน ... ฉันไม่เห็นว่าเราควรได้ 0.17 ด้วยคณิตศาสตร์ คำตอบของคุณสมบูรณ์แบบสำหรับตัวอย่างการเขียนโปรแกรม แต่ไม่ละเอียดมากนัก
เบอนัวต์ดัฟเช่

2
อย่างที่ฉันเคยพูดไปแล้ว ฉันรู้ว่ามันไม่ใช่คำตอบที่ถูกต้องสำหรับคำถามนี้ แต่คนมักจะชอบ :) อาจเป็นเพราะชื่อคำถามที่อาจเป็นผลการค้นหาสำหรับคนที่กำลังมองหาROUNDฟังก์ชั่น
jmarceli

จากนั้นคุณควรแก้ไข ฉันจะยังคงได้รับประโยชน์สำหรับทุกคนและมันจะถูกต้อง 100% Win-win :)
เบอนัวต์ดัฟเฟซ

14

วิธี CAST(2229.999 AS DECIMAL(6,2)) การรับทศนิยมด้วยทศนิยม 2 ตำแหน่ง


4
ฉันคิดว่าคุณหมายถึงนักแสดง (2229.999 เป็นทศนิยม (4,2))
ลุง Iroh

@UncleIroh, convert(2229.999 as decimal(4,2))ไม่มีผมคิดว่าเขาหมายถึง
Pacerier

3
@Pacerier - ทั้งสองทำงานในทางเทคนิค อย่างไรก็ตามรูปแบบของการแปลงคือการแปลง (2229.999, ทศนิยม (4,2)) ด้วยเครื่องหมายจุลภาคดังนั้นคุณอาจพูดถูกว่าเป็นสิ่งที่เขาต้องการ
ลุง Iroh

@ UncleIroh อาใช่พิมพ์ผิดของฉันด้านบน convert(2229.999, decimal(4,2))ผมได้พูดคุยเกี่ยวกับ
Pacerier

4
นักแสดง (2229.999 ตามที่กำหนด (4,2)) จะให้คุณ 99.99 DECIMAL คือจำนวนหลักสูงสุดรวมถึง 2 ทางด้านซ้ายของจุดทศนิยม นักแสดง (2229.99 ตามประกาศ (6,2)) จะให้เวลา 2230.00 น.
russjohnson09


0

นี่คือวิธีที่ฉันใช้นี่เป็นตัวอย่าง:

CAST(vAvgMaterialUnitCost.`avgUnitCost` AS DECIMAL(11,2)) * woMaterials.`qtyUsed` AS materialCost

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