Marvin, minuter till tim & min

  • Författare
  • Meddelande

pontaro

sql-kodare

  • Inlägg: 57
  • Blev medlem: 22 jan 2015, 18:42
  • Ort: Tyresö

Marvin, minuter till tim & min

Inlägg28 jan 2015, 14:34

Hej!

Jag har lite problem att få till omvandlingen från minuter till timmar och minuter. Jag förstår det matematiskt, men inte hur jag kan översätta det till kod. Jag måste ju spara enbart timdelen efter första divisionen med 60., för att sedan fortsätta med minutberäkningen. Hur sparar jag undan enbart timdelen, dvs fram tills punkten?
Success consists of going from failure to failure without loss of enthusiasm.
Användarvisningsbild

Vesihiisi

*nix-hackare

  • Inlägg: 115
  • Blev medlem: 13 dec 2014, 16:32
  • Ort: Göteborg

Re: Marvin, minuter till tim & min

Inlägg28 jan 2015, 14:40

Jag lyckades göra det genom att konvertera resultatet av divisionen till en integer:

Kod: Markera allt
>>> 337/60
5.616666666666666
>>> int(337/60)
5

Limeliz

css-hackare

  • Inlägg: 29
  • Blev medlem: 17 jan 2015, 17:44
  • Ort: Lidingö

Re: Marvin, minuter till tim & min

Inlägg28 jan 2015, 15:05

Avänd normal heltalsdivision och dela med 60 (antalet minuter per timme) för att få fram timmarna. Använd sedan modulus (%) för att få fram hur många minuter som blir över när alla hela timmar är räknade.

Kod: Markera allt
minuter_totalt = 337
timmar = minuter_totalt // 60      # 5 timmar
minuter = minuter_totalt % 60      # 37 minuter
Senast redigerad av Limeliz 28 jan 2015, 15:54, redigerad totalt 1 gång.
Användarvisningsbild

mos

dbwebb

  • Inlägg: 10922
  • Blev medlem: 10 nov 2011, 09:52
  • Ort: Ronneby / Bankeryd

Re: Marvin, minuter till tim & min

Inlägg28 jan 2015, 15:09

Här är ett par konstruktioner som låter passande i sammanhanget och dessutom ofta återkommer i diverse programmeringskonstuktioner.

Lite kryptiskt sådär, i kod. Fråga om oklart.
Kod: Markera allt
>>> round(355/60)
6
>>> 355 % 60
55
>>> 355/60
5.9166666666666664
>>> 355//60
5
>>> floor(355/60)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'floor' is not defined
>>> import math
>>> math.floor(355/60)
5
>>>
...
..:
.... /mos

jonas81

html-kodare

  • Inlägg: 18
  • Blev medlem: 15 jan 2015, 00:01

Re: Marvin, minuter till tim & min

Inlägg28 jan 2015, 15:29

I Python 3 är / operatorn "vanlig" division till skillnad mot i Python 2 där den är heltalsdivision. För heltalsdivision i Python 3 används //

För me information se https://www.python.org/dev/peps/pep-0238/

pontaro

sql-kodare

  • Inlägg: 57
  • Blev medlem: 22 jan 2015, 18:42
  • Ort: Tyresö

Re: Marvin, minuter till tim & min

Inlägg28 jan 2015, 15:43

Tack för snabba och bra svar! Det fanns lite varianter att välja mellan, ska försöka att lägga dem på minnet!
Success consists of going from failure to failure without loss of enthusiasm.

Emma_Wahlberg

javascriptare

  • Inlägg: 31
  • Blev medlem: 18 jan 2015, 19:17
  • Ort: Stockholm

Re: Marvin, minuter till tim & min

Inlägg29 jan 2015, 08:55

Själv använder jag den här tekniken:

Kod: Markera allt
a = 1.234
b = a - int(a)


En del anväder floor i liknande uppställningar, men tycker att ovanstående är kort och koncis och fungerar allt. Floor kräver ju en extra modul. Modulus (%) ger lite konstigt och oväntat resultat ibland.
Användarvisningsbild

Vesihiisi

*nix-hackare

  • Inlägg: 115
  • Blev medlem: 13 dec 2014, 16:32
  • Ort: Göteborg

Re: Marvin, minuter till tim & min

Inlägg29 jan 2015, 11:04

Emma_Wahlberg skrev:En del anväder floor i liknande uppställningar, men tycker att ovanstående är kort och koncis och fungerar allt. Floor kräver ju en extra modul. Modulus (%) ger lite konstigt och oväntat resultat ibland.


Fast just i det här fallet måste man använda modulo eftersom en timma består av 60 minuter, inte 100? Tjugotre hundradelar av en timme är inte samma som 23 minuter. Så man måste uttrycka "resten av divisionen med 60" på något sätt.

Emma_Wahlberg

javascriptare

  • Inlägg: 31
  • Blev medlem: 18 jan 2015, 19:17
  • Ort: Stockholm

Re: Marvin, minuter till tim & min

Inlägg29 jan 2015, 11:29

Ja, det får man räkna ut på ett annat sätt, ovanstående funktion separerar bara decimalerna från talet.

T.ex:
Kod: Markera allt
timmar = minuter / 60 # ger ett decimaltal
kvarvarande_minuter = (timmar - int(timmar))*60


Så får man tänka på att hantera avrundningar på lämpligt sätt. Just där ställer modulus till det en del. Modulus är säkert mer självklart egentligen, men jag har märkt att det ofta är en källa till problem längre fram om man räknar vidare.
Användarvisningsbild

Sylvanas

dbwebb

  • Inlägg: 1133
  • Blev medlem: 16 nov 2011, 17:03
  • Ort: Karlskrona

Re: Marvin, minuter till tim & min

Inlägg29 jan 2015, 11:54

Jag upplever att modulus är ett utmärkt sätt att få ut vad en rest blir.
Jag hade gjort såhär, kort och gott:
Kod: Markera allt
hours = minutes // 60
rest_minutes = minutes % 60
Brain - "Are you pondering what I'm pondering?"
Pinky - "I think so, Brain, but there's still a bug stuck in here from last time."

Emma_Wahlberg

javascriptare

  • Inlägg: 31
  • Blev medlem: 18 jan 2015, 19:17
  • Ort: Stockholm

Re: Marvin, minuter till tim & min

Inlägg29 jan 2015, 12:05

Sylvanas skrev:Jag upplever att modulus är ett utmärkt sätt att få ut vad en rest blir.
Jag hade gjort såhär, kort och gott:
Kod: Markera allt
hours = minutes // 60
rest_minutes = minutes % 60


Ja, det är i grunden samma lösning. :)

Om du börjar lägga till lite mer decimaler i input så kommer det dock bli lite olika resultat vid avrundningar. För det här enkla problemet fungerar modulus ganska långt. Det finns minst 3 olika lösningar på problemet; med modulus, floor och subtraktionsmodellen de vanligaste. Vilken man använder beror väl på vad man i slutändan tänker använda resultatet till, och hastigheten på de olika operationerna om det är viktigt för en.
Användarvisningsbild

mos

dbwebb

  • Inlägg: 10922
  • Blev medlem: 10 nov 2011, 09:52
  • Ort: Ronneby / Bankeryd

Re: Marvin, minuter till tim & min

Inlägg29 jan 2015, 12:33

Emma_Wahlberg skrev:Om du börjar lägga till lite mer decimaler i input så kommer det dock bli lite olika resultat vid avrundningar.


Tänkte du på ett sådant här exempel?
Kod: Markera allt
>>> min=355.45   
>>> min % 60     
55.44999999999999
>>>     
...
..:
.... /mos

Emma_Wahlberg

javascriptare

  • Inlägg: 31
  • Blev medlem: 18 jan 2015, 19:17
  • Ort: Stockholm

Re: Marvin, minuter till tim & min

Inlägg29 jan 2015, 12:43

mos skrev:
Emma_Wahlberg skrev:Om du börjar lägga till lite mer decimaler i input så kommer det dock bli lite olika resultat vid avrundningar.


Tänkte du på ett sådant här exempel?
Kod: Markera allt
>>> min=355.45   
>>> min % 60     
55.44999999999999
>>>     


Ja, till exempel. Om en leker runt lite med olika tal blir det lite olika beroende på vilken metod som används. Vad det beror på och vad det innebär i längden går bortom mina matematiska kunskaper. Men jag har brottats lite med just att räkna på tid förut, och märkt en del problem i kombination med round.
Användarvisningsbild

mos

dbwebb

  • Inlägg: 10922
  • Blev medlem: 10 nov 2011, 09:52
  • Ort: Ronneby / Bankeryd

Re: Marvin, minuter till tim & min

Inlägg29 jan 2015, 17:41

Jo, att räkna med "float" innebär att man räknar med ungefärliga värden och det beror av hur decimaltalen lagras i datorn.

Ta till exempel följande:
Kod: Markera allt
>>> 0.1 + 0.2 == 0.3
False
>>> 0.1 + 0.2
0.30000000000000004
>>>


Inte direkt logiskt, men det är alltså ingen bugg utan ett beteende som finns i "alla" programmeringsspråk som räknar med float.

Här finns att läsa mer om ämnet:
https://docs.python.org/3.4/tutorial/floatingpoint.html

Men "float" måste man alltså vara medveten om att det är ungefärliga värden som används och troligen är de tillräckligt nära vad vi uppfattar som logiskt, men vi kan inte vara fullständigt säkra.

Om man vill räkna exakt rätt så erbjuder ofta programmeringsspråken en särskild datatyp, ofta kallad Numeric, som hjälper till med det. Men det blir lite mer omständigt i Python.
Kod: Markera allt
>>> from decimal import *
>>> Decimal("0.1") + Decimal("0.2")
Decimal('0.3')
>>> Decimal("0.1")
Decimal('0.1')
>>> Decimal(0.1)
Decimal('0.1000000000000000055511151231257827021181583404541015625')
>>>

https://docs.python.org/3.4/library/decimal.html

Så, låt oss sammanfatta att talen med kommatecken är ungefärliga men oftast tillräckligt exakta. Avrunda dem till ett visst antal decimaler om det är ett bekymmer. Som alternativ finns stöd för Decimal.

Och räcker inte det så finns en förklaringen här om floating point:
http://en.wikipedia.org/wiki/Floating_point
...
..:
.... /mos

Emma_Wahlberg

javascriptare

  • Inlägg: 31
  • Blev medlem: 18 jan 2015, 19:17
  • Ort: Stockholm

Re: Marvin, minuter till tim & min

Inlägg29 jan 2015, 23:25

mos skrev:Jo, att räkna med "float" innebär att man räknar med ungefärliga värden och det beror av hur decimaltalen lagras i datorn. [...]


Tack för klargörandet!

Vilka är online

Användare som besöker denna kategori: Inga registrerade användare och 11 gäster