|
Округление
|
|||
---|---|---|---|
#18+
Всем привет! Есть проблема округления значения в C# и Cи, хотелось бы добиться однозначности при округлении. Есть значение 7.5077946401986963f в C# =7.507795, а в Си =7,50779486. Можно ли в C# указать какие-то правила округления для float ? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2015, 10:10 |
|
Округление
|
|||
---|---|---|---|
#18+
StanislavЕсть значение 7.5077946401986963f в C# =7.507795 хм Код: c# 1.
7,50779486 ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2015, 10:24 |
|
Округление
|
|||
---|---|---|---|
#18+
Shocker.ProStanislavЕсть значение 7.5077946401986963f в C# =7.507795 хм Код: c# 1.
7,50779486 хм. Спасибо! Round я не додумался сделать ) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2015, 10:31 |
|
Округление
|
|||
---|---|---|---|
#18+
StanislavRound я не додумался сделатьStanislavЕсть проблема округления значенияа что тогда подразумевается под округлением? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2015, 10:35 |
|
Округление
|
|||
---|---|---|---|
#18+
Shocker.ProStanislavRound я не додумался сделатьStanislavЕсть проблема округления значенияа что тогда подразумевается под округлением? Debug.WriteLine(7.5077946401986963f); ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2015, 10:40 |
|
Округление
|
|||
---|---|---|---|
#18+
Ну то есть ты фактически делаешь ToString() Ему тоже можно задать параметры форматирования строки ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2015, 10:49 |
|
Округление
|
|||
---|---|---|---|
#18+
Shocker.ProНу то есть ты фактически делаешь ToString() Ему тоже можно задать параметры форматирования строки Получатся если так Код: c# 1.
тип Код: c# 1.
а так Код: c# 1.
тип Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2015, 10:58 |
|
Округление
|
|||
---|---|---|---|
#18+
Нет. В обоих случаях тип String Просто не используй неявные преобразования, и будет тебя щастье ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2015, 11:16 |
|
Округление
|
|||
---|---|---|---|
#18+
Shocker.ProНет. В обоих случаях тип String Просто не используй неявные преобразования, и будет тебя щастье да string, но в одном случае он получился через float в другом через double. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2015, 11:33 |
|
Округление
|
|||
---|---|---|---|
#18+
StanislavShocker.ProНет. В обоих случаях тип String Просто не используй неявные преобразования, и будет тебя щастье да string, но в одном случае он получился через float в другом через double. если нужна большая точность чем double, используйте decimal, для float методов у Math нет ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2015, 11:55 |
|
Округление
|
|||
---|---|---|---|
#18+
Гыыыыы Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
Результат: 2,125 AwayFromZero --> 2,13 ToEven --> 2,12 string.Format("F:2") --> 2,13 2,135 AwayFromZero --> 2,13 ToEven --> 2,13 string.Format("F:2") --> 2,14 2,145 AwayFromZero --> 2,15 ToEven --> 2,14 string.Format("F:2") --> 2,15 3,125 AwayFromZero --> 3,13 ToEven --> 3,12 string.Format("F:2") --> 3,13 3,135 AwayFromZero --> 3,14 ToEven --> 3,14 string.Format("F:2") --> 3,14 3,145 AwayFromZero --> 3,15 ToEven --> 3,14 string.Format("F:2") --> 3,15 ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2018, 12:11 |
|
Округление
|
|||
---|---|---|---|
#18+
double это представление с погрешностью, т.е. 2,135 может быть в реале 2.13499999999999999999999999999 используй decimal ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2018, 12:20 |
|
Округление
|
|||
---|---|---|---|
#18+
Dima Tdouble это представление с погрешностью, т.е. 2,135 может быть в реале 2.13499999999999999999999999999 используй decimalОказывается по поводу этих 2.135, чуть ли ни диссертации написаны. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2018, 12:23 |
|
Округление
|
|||
---|---|---|---|
#18+
fortibransa, с этой проблемой борются с тех времен, как научились представлять дробные числа в виде мантиссы и экспоненты. В результате чего, у значения типа double или float всегда есть хвостик, который надо учитывать. С этим не нужно бороться, просто нужно не забывать об этом. В том числе и то, что 2 равных на 1 взгляд числа с типом double могут оказаться далеко не одним и тем же. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2018, 13:04 |
|
Округление
|
|||
---|---|---|---|
#18+
Roman Mejtesfortibransa, с этой проблемой борются с тех времен, как научились представлять дробные числа в виде мантиссы и экспоненты. В результате чего, у значения типа double или float всегда есть хвостик, который надо учитывать. С этим не нужно бороться, просто нужно не забывать об этом. В том числе и то, что 2 равных на 1 взгляд числа с типом double могут оказаться далеко не одним и тем же.Для этого в Round специально есть эта хрень MidpointRounding.AwayFromZero Что ты мне лекции читаешь, но она на 2.135 лажает, а стринг формат нет? Мне заказчики серьезные вопросы задают, почему в логе на экране такая цифра, а сохраняется другая. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2018, 14:23 |
|
Округление
|
|||
---|---|---|---|
#18+
fortibransaа стринг формат нет? тоже не идеален Код: c# 1. 2.
Результат Код: plaintext
ИМХО Как вариант можно перед округлением делать +0.001*минимальная разрядность, т.е. прибавлять значение больше погрешности, в этом случае будет гарантия что реальное значение чуть больше. Например если нужна точность до сотых, то Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2018, 15:23 |
|
Округление
|
|||
---|---|---|---|
#18+
fortibransa, в данном случае Round не виноват)) Поскольку бесконечное множество вещественных чисел отображается на конечное множество чисел диапазона того или иного типа (float/double/decimal) ошибки точности представления чисел неизбежны. Конечно, для decimal, при вдвое большем размере и меньшем диапазоне, они будут существенно меньше (незаментней) чем для double (и тем более для float). То, что мы захардкодили double-значение 2.135 и наблюдаем его в отладчике, еще не означает что оно таковым является (для процессора). Вот с помощью этой программы IEEE754 можно посмотреть в какое реальное значение "форматируется" задаваемое. В нашем случае точное значение 2.1349999999999997868371792719699442386627197265625 Косвенным подтверджением будут результаты в студии: var xval = 2.135 * 1e17; // 2.1349999999999997E+17 или в отладчике браузера: 2.135 * 1e17: 213499999999999970 ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2018, 20:28 |
|
Округление
|
|||
---|---|---|---|
#18+
Вот на этой страничке тоже можно посмотреть "Value actually stored in float" (для double нет, но не принципиально). ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2018, 20:59 |
|
Округление
|
|||
---|---|---|---|
#18+
LRfortibransa, в данном случае Round не виноват)) Поскольку бесконечное множество вещественных чисел отображается на конечное множество чисел диапазона того или иного типа (float/double/decimal) ошибки точности представления чисел неизбежны. Конечно, для decimal, при вдвое большем размере и меньшем диапазоне, они будут существенно меньше (незаментней) чем для double (и тем более для float). То, что мы захардкодили double-значение 2.135 и наблюдаем его в отладчике, еще не означает что оно таковым является (для процессора). Вот с помощью этой программы IEEE754 можно посмотреть в какое реальное значение "форматируется" задаваемое. В нашем случае точное значение 2.1349999999999997868371792719699442386627197265625 Косвенным подтверджением будут результаты в студии: var xval = 2.135 * 1e17; // 2.1349999999999997E+17 или в отладчике браузера: 2.135 * 1e17: 213499999999999970 я кинул ссылку автору на лекцию из MIT, но он не хотел, не читать, не смотреть, думаю до него и так не дойдет. Ему просто "надо", а как, не его проблемы. Хочет заставить компьютер работать ,но при этом не хочет знать как он работает =) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.06.2018, 00:05 |
|
Округление
|
|||
---|---|---|---|
#18+
Roman Mejtesна лекцию из MIT Спасибо за ссылку, чудесная лекция, потрясающий препод)) Кстати, "полагаясь на print" тоже можно было бы ухватить суть проблемы (G9/G17 - "максимальный" вывод): System.Diagnostics.Debug.WriteLine($"2.135f={2.135f:G8}(G8)={2.135f:G9}(G9), 2.135d={2.135d:G16}(G16)={2.135d:G17}(G17)"); ---------- 2.135f=2.135(G8)=2.13499999(G9), 2.135d=2.135(G16)=2.1349999999999998(G17) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.06.2018, 00:43 |
|
Округление
|
|||
---|---|---|---|
#18+
Roman MejtesLRfortibransa, в данном случае Round не виноват)) Поскольку бесконечное множество вещественных чисел отображается на конечное множество чисел диапазона того или иного типа (float/double/decimal) ошибки точности представления чисел неизбежны. Конечно, для decimal, при вдвое большем размере и меньшем диапазоне, они будут существенно меньше (незаментней) чем для double (и тем более для float). То, что мы захардкодили double-значение 2.135 и наблюдаем его в отладчике, еще не означает что оно таковым является (для процессора). Вот с помощью этой программы IEEE754 можно посмотреть в какое реальное значение "форматируется" задаваемое. В нашем случае точное значение 2.1349999999999997868371792719699442386627197265625 Косвенным подтверджением будут результаты в студии: var xval = 2.135 * 1e17; // 2.1349999999999997E+17 или в отладчике браузера: 2.135 * 1e17: 213499999999999970 я кинул ссылку автору на лекцию из MIT, но он не хотел, не читать, не смотреть, думаю до него и так не дойдет. Ему просто "надо", а как, не его проблемы. Хочет заставить компьютер работать ,но при этом не хочет знать как он работает =)Родной, я знаю как он работает и без лекций того чувачка, лекции и сам могу почитать. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.06.2018, 07:03 |
|
Округление
|
|||
---|---|---|---|
#18+
Что-то затормозил. Есть число 1.299999999. Как сделать округление до 3-х знаков после запятой, но если после округления получили, например, "1.300", то показывало бы "1.3". Т.е. незначащие нули отсекались бы. Все это нужно сделать, используя строки стандартных числовых форматов. Типа "F3" или "G3". ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2018, 11:04 |
|
Округление
|
|||
---|---|---|---|
#18+
vlsaf, Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2018, 11:14 |
|
|
start [/forum/topic.php?fid=20&fpage=29&tid=1399319]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
60ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
others: | 307ms |
total: | 448ms |
0 / 0 |