Tôi muốn nhận số sau dấu chấm thập phân ở dạng số nguyên. Ví dụ: chỉ 05 từ 1,05 hoặc từ 2,50 chỉ 50 chứ không phải 0,50
decimal, float, string, ...?
Tôi muốn nhận số sau dấu chấm thập phân ở dạng số nguyên. Ví dụ: chỉ 05 từ 1,05 hoặc từ 2,50 chỉ 50 chứ không phải 0,50
decimal, float, string, ...?
Câu trả lời:
Cập nhật câu trả lời
Ở đây tôi đưa ra 3 cách tiếp cận giống nhau.
[1] Giải toán bằng Math.Truncate
var float_number = 12.345;
var result = float_number - Math.Truncate(float_number);
// đầu vào: 1.05
// đầu ra: "0.050000000000000044"
// đầu vào: 10.2
// đầu ra: 0,19999999999999929
Nếu đây không phải là kết quả như bạn mong đợi, thì bạn phải thay đổi kết quả thành dạng bạn muốn (nhưng bạn có thể thực hiện lại một số thao tác chuỗi.)
[2] sử dụng hệ số nhân [là 10 theo lũy thừa của N (ví dụ: 10² hoặc 10³) trong đó N là số chữ số thập phân]
// multiplier is " 10 to the power of 'N'" where 'N' is the number
// of decimal places
int multiplier = 1000;
double double_value = 12.345;
int double_result = (int)((double_value - (int)double_value) * multiplier);
// đầu ra 345
Nếu số vị trí thập phân không được cố định, thì cách tiếp cận này có thể tạo ra vấn đề.
[3] sử dụng "Cụm từ thông dụng (REGEX)"
chúng ta nên rất cẩn thận khi viết các giải pháp với chuỗi. Điều này sẽ không thích hợp ngoại trừ một số trường hợp.
Nếu bạn định thực hiện một số phép toán chuỗi với chữ số thập phân, thì điều này sẽ thích hợp hơn
string input_decimal_number = "1.50";
var regex = new System.Text.RegularExpressions.Regex("(?<=[\\.])[0-9]+");
if (regex.IsMatch(input_decimal_number))
{
string decimal_places = regex.Match(input_decimal_number).Value;
}
// đầu vào: "1.05"
// đầu ra: "05"
// đầu vào: "2.50"
// đầu ra: "50"
// đầu vào: "0.0550"
// đầu ra: "0550"
bạn có thể tìm thêm về Regex trên http://www.regexr.com/
., không phải lúc nào cũng là dấu phân cách thập phân (nghĩa là ở Châu Âu, dấu phân tách thập phân là ,). Bạn phải thêm CultureInfo.Invariantđể làm cho nó trở nên quốc tế. Mặc dù nó dễ dàng hơn chỉ để sử dụng x - Math.Truncate(x)và bạn có thể ảo diệu với kết quả đó.
tốt nhất trong cách tốt nhất là:
var floatNumber = 12.5523;
var x = floatNumber - Math.Truncate(floatNumber);
kết quả bạn có thể chuyển đổi theo cách bạn muốn
var decPlaces = (int)(((decimal)number % 1) * 100);
Điều này cho rằng số của bạn chỉ có hai chữ số thập phân.
(318.40d % 1) * 100kết quả đầu ra 39.9999999999977, bạn có thể sử dụng casting để có được xung quanh các lỗi làm tròn:var decPlaces = (int)(((decimal)number % 1) * 100);
Giải pháp không có vấn đề làm tròn:
double number = 10.20;
var first2DecimalPlaces = (int)(((decimal)number % 1) * 100);
Console.Write("{0:00}", first2DecimalPlaces);
Kết quả đầu ra: 20
Lưu ý nếu chúng tôi không ép kiểu sang thập phân, nó sẽ xuất ra
19.
Cũng thế:
318.40đầu ra: 40(thay vì 39)47.612345đầu ra: 61(thay vì 612345)3.01đầu ra: 01(thay vì 1)Nếu bạn đang làm việc với các con số tài chính, chẳng hạn như trong trường hợp này, bạn đang cố gắng lấy một phần xu của số tiền giao dịch, hãy luôn sử dụng
decimalkiểu dữ liệu.
Cập nhật:
Phần sau cũng sẽ hoạt động nếu xử lý nó dưới dạng chuỗi (xây dựng dựa trên câu trả lời của @ SearchForKnowledge).
10.2d.ToString("0.00", CultureInfo.InvariantCulture).Split('.')[1]
Sau đó, bạn có thể sử dụng Int32.Parseđể chuyển nó thành int.
Tôi đoán chủ đề này đã cũ nhưng tôi không thể tin rằng không ai đã đề cập đến Math.
//will always be .02 cents
(10.02m - System.Math.Floor(10.02m))
double fract(double x) { return x - System.Math.Floor(x); }
var result = number.ToString().Split(System.Globalization.NumberDecimalSeparator)[2]
Trả về nó dưới dạng một chuỗi (nhưng bạn luôn có thể chuyển nó trở lại int) và giả sử rằng số có dấu "." một vài nơi.
int last2digits = num - (int) ((double) (num / 100) * 100);
318.401567dđầu ra giải pháp của bạn 0.401567ở nơi 40mong đợi.
public static string FractionPart(this double instance)
{
var result = string.Empty;
var ic = CultureInfo.InvariantCulture;
var splits = instance.ToString(ic).Split(new[] { ic.NumberFormat.NumberDecimalSeparator }, StringSplitOptions.RemoveEmptyEntries);
if (splits.Count() > 1)
{
result = splits[1];
}
return result;
}
Đây là một phương pháp mở rộng tôi đã viết cho một tình huống tương tự. Ứng dụng của tôi sẽ nhận các số ở định dạng 2,3 hoặc 3,11 trong đó thành phần nguyên của số đại diện cho năm và thành phần phân số đại diện cho tháng.
// Sample Usage
int years, months;
double test1 = 2.11;
test1.Split(out years, out months);
// years = 2 and months = 11
public static class DoubleExtensions
{
public static void Split(this double number, out int years, out int months)
{
years = Convert.ToInt32(Math.Truncate(number));
double tempMonths = Math.Round(number - years, 2);
while ((tempMonths - Math.Floor(tempMonths)) > 0 && tempMonths != 0) tempMonths *= 10;
months = Convert.ToInt32(tempMonths);
}
}
Bạn có thể xóa dấu chấm .khỏi dấu đôi mà bạn đang cố lấy các số thập phân bằng cách sử dụngRemove() hàm sau khi chuyển đổi dấu kép thành chuỗi để bạn có thể thực hiện các thao tác cần thiết trên nó
Hãy xem xét có một _Doublegiá trị gấp đôi 0.66781, đoạn mã sau sẽ chỉ hiển thị các số sau dấu chấm .là66781
double _Double = 0.66781; //Declare a new double with a value of 0.66781
string _Decimals = _Double.ToString().Remove(0, _Double.ToString().IndexOf(".") + 1); //Remove everything starting with index 0 and ending at the index of ([the dot .] + 1)
Giải pháp khác
Bạn cũng có thể sử dụng lớp Pathnày thực hiện các hoạt động trên các cá thể chuỗi theo cách đa nền tảng
double _Double = 0.66781; //Declare a new double with a value of 0.66781
string Output = Path.GetExtension(D.ToString()).Replace(".",""); //Get (the dot and the content after the last dot available and replace the dot with nothing) as a new string object Output
//Do something
Sử dụng regex: Regex.Match("\.(?\d+)")Ai đó sửa cho tôi nếu tôi sai ở đây
Regex.Matchnhưng tôi đã nhận lỗi sau khi cố gắng để có được giá trị của chữ số thập phânArgumentException was unhandled: parsing "\.(?\d+)" - Unrecognized grouping construct.
Nó rất đơn giản
float moveWater = Mathf.PingPong(theTime * speed, 100) * .015f;
int m = (int)(moveWater);
float decimalPart= moveWater -m ;
Debug.Log(decimalPart);
Tại sao không sử dụng int y = value.Split('.')[1];?
Các Split()chức năng tách giá trị vào nội dung riêng biệt và 1được xuất ra giá trị thứ 2 sau.
Int32.Parse((12.05123d.ToString("0.00").Split('.')[1]))