2009-12-17 22 views
16

Tôi muốn có thể làm tròn một số thành n số liệu quan trọng trong SQL. Vì vậy:Vòng thành n Số liệu quan trọng trong SQL

123.456 rounded to 2sf would give 120 
0.0rounded to 2sf would give 0.0012 

Tôi biết hàm ROUND(), làm tròn đến số thập phân thay vì số liệu quan trọng.

Trả lời

16

select round(@number,@sf-1- floor(log10(abs(@number)))) nên làm các trick!

Thử nghiệm thành công trên hai ví dụ của bạn.

Chỉnh sửa: Gọi chức năng này trên @ number = 0 sẽ không hoạt động. Bạn nên thêm một thử nghiệm cho điều này trước khi sử dụng mã này.

create function sfround(@number float, @sf int) returns float as 
begin 
    declare @r float 
    select @r = case when @number = 0 then 0 else round(@number ,@sf -1-floor(log10(abs(@number)))) end 
    return (@r) 
end 
+0

Điều đó hoạt động tốt và đơn giản hơn nhiều so với những gì tôi đã đưa ra :-) – Paul

+0

Mặc dù phải đảm bảo @number không phải là 0 – Paul

+1

thực sự; cập nhật cho phù hợp. – Brann

0

Bạn có thể chia cho 100 trước khi làm tròn và sau đó nhân với 100 ...

+0

Điều đó sẽ không hoạt động trên ví dụ thứ hai – Paul

+1

Chia, sàn và nhân là một cách để cắt ngắn đến các chữ số thập phân, thay vì làm tròn số liệu quan trọng. – Paul

0

Tôi nghĩ mình đã quản lý nó.

CREATE FUNCTION RoundSigFig(@Number float, @Figures int) 
RETURNS float 
AS 
BEGIN 

    DECLARE @Answer float; 

    SET @Answer = (
    SELECT 
     CASE WHEN intPower IS NULL THEN 0 
     ELSE FLOOR(fltNumber * POWER(CAST(10 AS float), intPower) + 0.5) 
       * POWER(CAST(10 AS float), -intPower) 
     END AS ans 
    FROM (
     SELECT 
      @Number AS fltNumber, 
      CASE WHEN @Number > 0 
       THEN -((CEILING(LOG10(@Number)) - @Figures)) 
      WHEN @Number < 0 
       THEN -((FLOOR(LOG10(@Number)) - @Figures)) 
      ELSE NULL END AS intPower  
     ) t 
    ); 

    RETURN @Answer; 
END 
0

Điều chỉnh câu trả lời phổ biến nhất của Brann thành MySQL cho những người đến như tôi.

CREATE FUNCTION `sfround`(num FLOAT, sf INT) # creates the function 
RETURNS float # defines output type 
DETERMINISTIC# given input, will return same output 

BEGIN 

    DECLARE r FLOAT; # make a variable called r, defined as a float 

    IF(num IS NULL OR num = 0) THEN # ensure the number exists, and isn't 0 
     SET r = num; # if it is; leave alone 

    ELSE 
     SET r = ROUND(num, sf - 1 - FLOOR(LOG10(ABS(num)))); 
    /* see below*/ 
    END IF; 

    RETURN (r); 

END 

/* Felt quá lâu để đưa vào comment */

ROUND (num, sf - 1 - FLOOR (LOG10 (ABS (num))))

  • Phần rằng tác phẩm - sử dụng hàm ROUND trên số như bình thường, nhưng độ dài được làm tròn thành được tính là
  • ABS đảm bảo tích cực
  • LOG10 nhận số chữ số lớn hơn 0 trong số
  • SÀN nhận được số nguyên lớn nhất nhỏ hơn so với số lượng kết quả
  • Vì vậy, luôn làm tròn xuống và đưa ra một số nguyên
  • sf - 1 - FLOOR (...) đưa ra một số âm
  • công trình vì ROUND (num, num-ve) làm tròn đến bên trái của dấu thập phân

  • Đối với chỉ một off, ROUND (123,456, -1) và ROUND (0.00123,4) trả lại câu trả lời yêu cầu ((120, 0.0012)

Các vấn đề liên quan