Loading...
+ Нов въпрос
Hristo_Penchev avatar Hristo_Penchev 389 Точки

Синтаксис при действия с променливи

Здравейте. В този код normalWeekends е равно на 40 но долния код ми връща стойност 0 на double footballNormalWeekends.

double footballNormalWeekends = 2/3*2*normalWeekends;

Не знам защо дава грешка, би трябвало да извърши действията последователно. Когато има само умножение и деление скоби не са необходими.

 

Ако задам кода по този начин:

double footballNormalWeekends = 4*normalWeekends/3;

всичко е точно и ми връща коректна стойност. Но не мога да разбера какво му е грешното на първия израз.

 

Тагове:
0
Programming Basics
MarinPetrov avatar MarinPetrov 20 Точки

Ами именно защото 2/3 е равно на 0 ; и след това ти умножава нулата по всичко останало и става нула !

2 и 3 са int по подразбиране ! И като делиш от по малко по голямо ти дава 0!

2
nickpanaiotov avatar nickpanaiotov 21 Точки

Кастни двойката към double и виж дали ще стане.

double footballNormalWeekends =((double) 2)/3*2*normalWeekends

0
jabalka avatar jabalka 960 Точки

"double footballNormalWeekends =((double) 2)/3*2*normalWeekends"

или

double footballNormalWeekends =2.0/3*2*normalWeekends

1
Hristo_Penchev avatar Hristo_Penchev 389 Точки

Ясно, трябва изрично да кастна числата към дабъл. Ама то дори не закръгля както трябва. 2/3 е по-близо до 1 и натам трябва да закръгли, поне доколкото съм учил математика.

А ако резултатът е едно цяло и две трети, как го закръгля?

0
mihayloff14 avatar mihayloff14 824 Точки

Когато закръгля към цяло число, то фактически не го закръгля, а реже стойността на числото след запетаята. Пример:

double 2.89 --> int 2

0
kyamaliev avatar kyamaliev 209 Точки

В C#(а и не само) операцията  "/" между цели числа (int) не е делене като на елката, а е целочислено делене - дава само числото преди десетичната запетая.

Както колегата MartinPetrov каза, 2 и 3 са int, и съответно между тях делението е целочислено.

Можеш или да кастнеш, или да напишеш 2.0/3.0, с което ще дадеш да се разбере, че числата не са int-ове:)

Ако искаш да закръгляш, ползвай Math.Round, примерно Math.Round(2.0 / 3.0, 0) ще ти го закръгли на 1. Поздрави
4
dsmilyanov avatar dsmilyanov 237 Точки

Колега, виждам, че вече са ти отговорили защо вади 0 точно този код, но искам само да добавя нещо. Това "когато има само умножение и деление скоби не са необходими" най-добре го забрави. Абсолютно винаги слагай скоби. Може да имаш само две събирания, пак слагай скоби. Последователността на действията се изяснява на пръв поглед, кодът работи както се очаква, а и за четене от трето лице е много по-лесно. Вярно, малко повече писане е добавянето на 2-3 скоби, но ядовете in the long run са много по-малко.

Успех!

1
jabalka avatar jabalka 960 Точки
Здравей. Сетих се за още нещо полезно, малко по-принципно. Ти в момента имаш на един ред три операции - /, * и *. Можеш само да гадаеш кога числото става на 0. Удобно е да си разделиш всяка операция в отделна променлива на отделен ред и ще видиш точно кога изразът ти се нулира. Тогава ще видиш, че 2/3 е равно на 0 и по-лесно ще намериш дори и в гуугъл защо това делене ти дава нула. Като цяло избягвай на един ред да извършваш много операции точно по тази причина - ако има грешка, трудно ще я намериш и не можеш да ползваш дебъгера. Поздрави!
2
nikola.m.nikolov avatar nikola.m.nikolov 830 Точки

Сложи d след всяко int число и по този начин ще укажеш, че са double:

double footballNormalWeekends = 2d / 3d * 2d * normalWeekends;

 

А за закръгляне когато трябва да е надолу често пъти забелязвам дори и в авторските решения да се връща просто int число на резултата. Преди да открия и аз този вариант търсих как се прави Round Up и Round Down и намерих следното:

за UP - Math.Ceiling(number)

за Down - Math.Floor (number)

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.