Tại sao kết quả này bằng 0 và không phải là 1?Tại sao 0.5 được làm tròn với kết quả MidpointRounding.AwayFromZero bằng 0?
Math.Round(0.5, 0, MidpointRounding.AwayFromZero)
Dưới đây là một ví dụ: http://ideone.com/ayMVO
Tại sao kết quả này bằng 0 và không phải là 1?Tại sao 0.5 được làm tròn với kết quả MidpointRounding.AwayFromZero bằng 0?
Math.Round(0.5, 0, MidpointRounding.AwayFromZero)
Dưới đây là một ví dụ: http://ideone.com/ayMVO
Thông thường, với các vấn đề như vậy, đó là vì số lượng không thể được đại diện chính xác trong IEEE754 - đó là rất có thể nó đang được chuyển đổi sang 0,4999999999 ... hoặc một cái gì đó như thế mà sẽ làm tròn thành 0.
Tuy nhiên, 0,5 (1/2) là được thể hiện chính xác trong IEEE754 do đó không phải như vậy ở đây.
Có thể trình biên dịch đã thực hiện một sai lầm trong việc chuyển đổi văn bản thành một số nhưng tôi nghĩ điều đó là không thể. Trong thực tế, khi tôi biên soạn và thực hiện những điều sau đây trong VC# 2010:
using System;
namespace ConsoleApplication1 {
class Program {
static void Main (string[] args) {
Console.WriteLine (Math.Round (0.5, 0, MidpointRounding.AwayFromZero));
}
}
}
Tôi nhận được kết quả là 1
như mong đợi.
Vì vậy, tôi không nghĩ câu hỏi của bạn khá hoàn chỉnh. Hiện tại, có thể là tình huống thực tế của bạn không sử dụng giá trị mã hóa cứng 0.5
mà thay vào đó sử dụng biến số mà bạn tin rằng là 0,5.
câu trả lời của tôi cho rằng sẽ được rằng, trong khi nó có thể gần-0,5 (chắc chắn đủ gần mà đơn giản WriteLine
của nó có thể sản lượng 0,5), nó có thể là một liên lạc dưới đây 0,5, trong đó sẽ gây ra ý kiến của tôi trong đoạn đầu tiên ở trên để một lần nữa đá vào.
Dựa trên liên kết của bạn, có vẻ như Mono 2.8 có thể có lỗi. Tôi muốn đề nghị tìm kiếm sự hỗ trợ từ các nhà phát triển (hoặc chỉ cần đưa ra một báo cáo lỗi) here.
Thực ra, đã thử địa phương với gmcs 2.6.7, đó chắc chắn là lỗi. Mã đó được biên dịch chính xác nhưng không tạo ra 0 thay vì 1. Một bug report đã được nâng lên và tôi đã thêm thông tin của riêng mình vào đó.
Có thể làm tròn một số tới số nguyên gần nhất luôn làm tròn lên cho '.5'? – Acorn
Có, sử dụng sản phẩm của Microsoft hoặc gửi báo cáo lỗi trên Mono :-) – paxdiablo
Nguyên bản không phải là tùy chọn khi tôi viết mã cho khung Unity3d sử dụng Mono, nhưng nếu đó thực sự là lỗi, tôi sẽ cố gắng và pester ai đó về nó :) – Acorn
Điều này cũng trả về 1.0 cho tôi khi tôi gỡ lỗi.
Math.Round(0.5, 0, MidpointRounding.AwayFromZero)
Điều đó không đúng, AwayFromZero là một thuật toán khác so với làm tròn của ngân hàng. Ngân hàng làm tròn là ToEven. –
@WaynnLue lỗi của tôi, tôi đã xóa bài đăng gốc. Tôi đã chạy mã và tôi nhận được 1.0 – Seany84
0,5 là gấp đôi.
Nếu bạn làm
Math.Round(0.5M, 0, MidpointRounding.AwayFromZero)
Nó sẽ làm việc như mong đợi
Nó trả về 1 đối với tôi. – svick
http://ideone.com/ayMVO – Acorn
bạn có chắc là bạn không áp dụng điều gì khác cho điều này. các thử nghiệm của tôi dẫn đến 1 là kết quả của phép tính này. –